# object 深度合并
const obj1 = {
a: 1,
b: 2,
obj: {
x: 'x',
y: 'y',
},
arr: [
{ l: 'l', m: 'm' },
{ l: 'l', m: 'm' },
{ l: 'l', m: 'm' },
],
}
const obj2 = {
a: 2,
c: 3,
obj: {
x: 'xA',
z: 'z',
},
arr: [
{ l: 'l', n: 'n' },
{ l: 'l1', m: 'm1', n: 'n1' },
],
}
console.log('obj1', obj1, 'obj2', obj2)
function deepAssign(one, two) {
const newObj = JSON.parse(JSON.stringify(one))
Object.keys(two).forEach(key => {
if (!newObj.hasOwnProperty(key)) {
newObj[key] = two[key]
} else {
if (two[key] instanceof Object) {
newObj[key] = deepAssign(newObj[key], two[key])
} else if (two[key] instanceof Array) {
two[key].forEach((item, index) => {
if (newObj[key][index]) {
newObj[key][index] = deepAssign(newObj[key][index], two[key][index])
} else {
newObj[key].push(two[key][index])
}
})
} else {
newObj[key] = two[key]
}
}
})
return newObj
}
const result = deepAssign(obj1, obj2)
console.log('result', result)
// result
// {
// a: 2,
// b: 2,
// c: 3,
// arr: [
// {l: "l", m: "m", n: "n"},
// {l: "l1", m: "m1", n: "n1"},
// {l: "l", m: "m"},
// ],
// obj: {
// x: "xA",
// y: "y",
// z: 'z'
// }
// }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71