如何深入复制对象而不替换ES6 / Javascript中的整个属性

时间:2018-08-23 22:41:17

标签: javascript ecmascript-6

我想将所有缺少的字段深深地复制到下面的示例代码所示的对象中。是否有快速的es6快捷方式可用于深度复制对象中缺少的属性?

我尝试使用Object.assign,但问题是它用第二个someKey对象代替了someKey,因为我希望它可以简单地复制所有属性。

这些对象也只是一些随机的演示,比如说魔术代码应该是不可知的

const x = {};

const a = { someKey: { first: 1 } };
const b = { someKey: { second: 2 } };
const c = { otherKey: { first: 1 } };

// some magic algorithm to get expected
Object.assign(x, a, b, c); // this doesn't work

const expected = {
  someKey: {
    first: 1,
    second: 2
  },
  otherKey: {
    first: 1
  }
};

2 个答案:

答案 0 :(得分:4)

拜访lá。运行代码片段进行演示。

const merge = function(){
  let target = arguments[0];
  Array.prototype.shift.apply(arguments);
  while (arguments[0]) {
    for (let key of Object.keys(arguments[0]))
      if (arguments[0][key] instanceof Object)
        Object.assign(arguments[0][key], merge(target[key], arguments[0][key]));
    Object.assign(target || {}, arguments[0]);
    Array.prototype.shift.apply(arguments);
  }
  return target;
}

const x = {};

const a = { someKey: { first: 1 } };
const b = { someKey: { second: 2 } };
const c = { otherKey: { first: 1 } };

console.log(merge(x,a,b,c));

答案 1 :(得分:0)

如果要对某些键进行合并,则必须手动进行操作。Object.assign在后发制胜时起作用,因此要合并键,您需要以下内容...

Object.assign({}, a, b, c, {someKey: Object.assign({}, a.someKey, b.someKey)})

以下代码可以阅读为...。 将“ A”,“ B”和“ C”合并在一起。...将“ A.someKey和b.someKey”合并在一起来覆盖someKey。