var a = {
1: {
687: {
name:'test1'
}
}
}
var b = {
1: {
689: {
name:'test2'
}
}
}
var c = {
...a,
...b
}
console.log(c)
我期待结果是:
{
1: {
687: {
name:'test1'
},
689: {
name:'test2'
}
}
}
但是,它是:
{
1: {
689: {
name:'test2'
}
}
}
我使用传播操作符错了吗?合并两个对象的最有效方法是什么?我创建了一个迭代对象中每个键的函数,它可以工作,但我认为这不是写入方式。
Object.assign({},a,b)
也返回相同的内容(第一个结果,我不想要)。
我经历了问题How can I merge properties of two JavaScript objects dynamically?
但它没有回答我的问题。这个答案(https://stackoverflow.com/a/171256/1352853)也不是我想要的。
提前致谢。
答案 0 :(得分:2)
lodash merge实际上做了我真正需要的东西。
https://blog.mariusschulz.com/2015/03/30/combining-settings-objects-with-lodash-assign-or-merge
// Defined within your component
var defaultSettings = {
strictMode: true,
formatting: {
finalNewline: true,
quotes: "double"
}
};
// Provided by the developer using your component
var userSettings = {
formatting: {
quotes: "single"
}
};
var assignedSettings = _.assign({}, defaultSettings, userSettings);
// {
// strictMode: true,
// formatting: {
// quotes: "single"
// }
// }
var mergedSettings = _.merge({}, defaultSettings, userSettings);
// {
// strictMode: true,
// formatting: {
// finalNewline: true,
// quotes: "single"
// }
// }
答案 1 :(得分:1)
spread运算符用于数组和可迭代对象。
如果x = ['A','B','C'];
然后...x
等于撰写x[0], x[1], x[2]
。
您希望逐个键地嵌入每个对象的嵌套对象,而不是替换以前的值。
let key;
let c = {};
for (key in a) {
c[key] = Object.assign({}, a[key]);
}
for (key in b) {
c[key] = Object.assign(c[key] || {}, b[key]);
}
答案 2 :(得分:-1)
您可以使用Object.assign(target, ...sources)
进行合并。需要注意的几点:
1.此调用突变了目标。
如果源是引用而不是实际对象,则只复制引用。
如果存在相同的密钥,它们将被覆盖。
要深度复制媒体资源,请考虑Object.hasOwnProperty()
和Object.getOwnProperty()