最后实现结果是这样的。
const b1 = {
ff: 'cccc',
a: 1,
b: {
d: 5,
c: 2,
dd: [1, 2, 3, { a: 15 }]
}
}
const result = merge(b1, {
e: 666,
a: 35,
b: {
a: 2,
c: 3,
dd: [4, 5, 9, { a: 26 }]
}
})
console.log(JSON.stringify(result));
// 结果是 {"ff":"cccc","a":35,"b":{"d":5,"c":3,"dd":[4,5,9,{"a":26}],"a":2},"e":666}
前一个对象没有,后一个对象有的key,要新增进去
前一个有的,后一个没有,不准覆盖和改变
不管多深的对象或者数组嵌套,都要遍历到,不准直接覆盖,而是按照,1, 2的说法对照
实现方案,那必须是递归了
const merge = (oldObj, newObj) => {
const isArray = Array.isArray
const isObj = val => typeof (val) === 'object' && val instanceof Object
if (isArray(oldObj) !== isArray(newObj) || isObj(oldObj) !== isObj(newObj)) {
throw new Error('入参前后应该为相同数据类型 数组或者对象')
}
for (const [index, item] of Object.entries(newObj)) {
if (!oldObj[index]) {
oldObj[index] = item
} else {
if (isObj(oldObj[index]) || isArray(oldObj[index])) {
merge(oldObj[index], item)
} else {
oldObj[index] = item
}
}
}
return oldObj
}
const b1 = {
ff: 'cccc',
a: 1,
b: {
d: 5,
c: 2,
dd: [1, 2, 3, { a: 15 }]
}
}
const result = merge(b1, {
e: 666,
a: 35,
b: {
a: 2,
c: 3,
dd: [4, 5, 9, { a: 26 }]
}
})
console.log(JSON.stringify(result));
// 结果是 {"ff":"cccc","a":35,"b":{"d":5,"c":3,"dd":[4,5,9,{"a":26}],"a":2},"e":666}
方案的入参判断还有些漏洞,不想写了。如需使用,加个判断就是