JavaScript对象的深层合并

271 阅读1分钟

前端经常有合并对象的操作,可以使用拓展运算符也可使使用Object.assign,但是如果对象的结构层次比较深,这两种方式有时候是无法实现的,比如有以下两个对象

obj1={
name:'zhangsan',
list:[1,2],
info:{
    age:18,
    desc:'desc info'
    
}
}
obj2={
name:'zhangsan',
list:[1,2],
info:{
    age:18,
}
}

如果现在想把obj2覆盖obj1,并且要保留obj1的desc字段,那常规的复制是不行,可以使用下面的方法

const result = { ...obj2 }
for (let key in obj1) {
 var value1 = obj1[key]
var value2 = result[key]

if (Object.prototype.hasOwnProperty.call(result, key)) {
if (Object.prototype.toString.call(value1) === "[object Object]" && Object.prototype.toString.call(value2) === "[object Object]") {
result[key] = deepMerge(value1, value2)
 }
 } else {
 result[key] = value1
}
};
 return result;
 }