如何在不替换 ES6/Javascript 中的整个属性的情况下深度复制对象 [重复]

Posted

技术标签:

【中文标题】如何在不替换 ES6/Javascript 中的整个属性的情况下深度复制对象 [重复]【英文标题】:How to deeply copy objects without replacing the entire property in ES6/Javascript [duplicate] 【发布时间】:2019-01-30 09:20:20 【问题描述】:

我想将所有缺失的字段深度复制到下面示例代码所示的对象中。有没有快速的 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
  
;

【问题讨论】:

考虑查看 jQuery 的 $.extend() 功能。 github.com/jquery/jquery/blob/master/src/core.js#L125 用于 jQuery 扩展实现。 【参考方案1】:

如果您想对某些键进行合并,则必须手动进行 Object.assign 适用于最后的胜利,因此要合并键,您需要以下内容...

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

下面的代码可以读作.... 将“A”、“B”和“C”合并在一起....用“A.someKey 和 b.someKey”的合并覆盖 someKey。

【讨论】:

【参考方案2】:

说吧。运行 sn -p 进行演示。

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));

【讨论】:

仅供参考:如果您有一个非常深的嵌套对象(例如d = someKey: random: word: first: 2 )并尝试执行merge(x,a,b,c,d),则此方法不起作用

以上是关于如何在不替换 ES6/Javascript 中的整个属性的情况下深度复制对象 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

在不循环的情况下将值更新到数据集中列中的整行

shell脚本sed命令如何使用变量替换掉包含指定字符串的整行

如何在不影响进程的空格的情况下替换js中的文本

如何在不重叠结果的情况下替换字符串中的多个字符串?

如何在不实际替换代码中的值的情况下获取与某些坐标对应的函数值?

如何在不执行 Queryable 的情况下以通用方式替换 Queryable<T> 中的列