# 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
上次更新: 2022-11-29 16:59:20(UTC +8)