Object.assign—override nested property

前端 未结 7 454
轮回少年
轮回少年 2020-12-13 01:36

I have an Object a like that:

const a = {
  user: {
   …
   groups: […]
   …
  }
}

whereby there are a lot more properties in

7条回答
  •  萌比男神i
    2020-12-13 02:27

    More general solution below. It makes recursively assigning only if there are conflicts (same key names). It resolves issues assigning complex objects, which has many reference points. For example, nested-object-assign, an existing package for nested object assign in npm, stuck with complex objects assign because it recursively goes through all keys.

    var objecttarget = {
      a: 'somestring',
      b: {x:2,y:{k:1,l:1},z:{j:3,l:4}},
      c: false
    };
    
    var objectsource = {
      a: 'somestring else',
      b: {k:1,x:2,y:{k:2,p:1},z:{}},
      c: true
    };
    
    function nestedassign(target, source) {
      Object.keys(source).forEach(sourcekey=>{
        if (Object.keys(source).find(targetkey=>targetkey===sourcekey) !== undefined && typeof source[sourcekey] === "object") {
          target[sourcekey]=nestedassign(target[sourcekey],source[sourcekey]);
        } else {
          target[sourcekey]=source[sourcekey];
        }
      });
      return target;
    }
    
    // It will lose objecttarget.b.y.l and objecttarget.b.z
    console.log(Object.assign(Object.create(objecttarget),objectsource));
    
    // Improved object assign
    console.log(nestedassign(Object.create(objecttarget),objectsource));

提交回复
热议问题