js实现一个多层级的对象合并

本文探讨了在JavaScript开发中遇到的多层级对象合并问题。通过分析,提出了一个解决方案,即当目标对象与源对象有相同键且值都是对象时,进行递归合并,否则替换目标对象的键值。文章最后提供了思路和测试案例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 在日常开发中经常要使用到对象的合并
  • js也提供了Object.assign(target, ...sources)的API用来合并对象,也可以使用展开运算符实现合并比如
let obj1 = {a:1,b:2,c:3}
let obj2 = {a:2,b:4,d:3}
let newObj = {...obj1,...obj2}
let newObj2 = Object.assign(obj1,obj2)
console.log(newObj,newObj2)
//{ a: 2, b: 4, c: 3, d: 3 } { a: 2, b: 4, c: 3, d: 3 }
  • 但是这样会有一个问题,就是无法合并多层结构的对象比如
let obj1 = {c:{q:1,w:2}}
let obj2 = {c:{e:3}}
let newObj = {...obj1,...obj2}
let newObj2 = Object.assign(obj1,obj2)
console.log(newObj,newObj2)
//{ c: { e: 3 } } { c: { e: 3 } }
  • 我们可以看到c属性只是进行了简单的替换
  • 所以今天就解决一下多层合并的问题
    1.思路分析
    1)我们要实现,如果目标对象中的属性具与源对象有相同的键并且相同的键的值也为对象,则将此对象也进行相同规则的合并,否则属性将被源对象中的属性覆盖,并且不同的键会同时存在
    2)首先要理解,target是主体,遍历sources对象,判断如果target对象存在相同键并且同时为对象,递归调用合并方法,否则将target对象键值替换
    3)返回新对象
function assiginObj(target = {},sources= {}){
    let obj = target;
    if(typeof target != 'object' || typeof sources != 'object'){
        return sources; // 如果其中一个不是对象 就返回sources
    }
    for(let key in sources){ 
        // 如果target也存在 那就再次合并
        if(target.hasOwnProperty(key)){
            obj[key] = assiginObj(target[key],sources[key]);
        } else {
            // 不存在就直接添加
            obj[key] = sources[key];
        }
    }
    return obj;
}

测试

let a = {
    a:{a:1,b:2,c:3},
    c:12,
    z:15
}
let b = {
    a:{a:12,e:13},
    b:13,
    z:16
}
console.log(assiginObj(a,b))
//{ a: { a: 12, b: 2, c: 3, e: 13 }, c: 12, z: 16, b: 13 }
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木木林_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值