如何在不替换 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命令如何使用变量替换掉包含指定字符串的整行