我尝试更新深层嵌套的对象而不覆盖现有属性,但无法找到一种优雅的方法来执行此操作,例如:
const data = {
items: {
one: {
active: false,
id: '123'
},
two: {
active: true
}
}
}
const updatedData = {
items: {
one: {
active: true
}
}
}
最终结果应为:
{
items: {
one: {
active: true,
id: '123'
},
two: {
active: true
}
}
}
但是,使用Object.assign
或点差运算符会将items.one
替换为{active: true}
而不会保留id
。有没有办法在没有递归遍历对象的情况下做到这一点?
答案 0 :(得分:0)
function merge(source, into) {
for(let key in into){
if(typeof into[key] === "object") {
merge(source[key] || (source[key] = {}), into[key]);
} else {
source[key] = into[key];
}
}
}
答案 1 :(得分:0)
递归函数使它非常简单。迭代新数据的属性。如果属性的目标和源都引用了一个对象,则使用这两个对象递归调用该函数。否则只需将源值分配给目标值。
const data = {
items: {
one: {
active: false,
id: '123'
},
two: {
active: true
}
}
}
const updatedData = {
items: {
one: {
active: true
}
}
}
updateWith(data, updatedData);
console.log(data);
function updateWith(target, newData) {
for (const [k, v] of Object.entries(newData)) {
if (typeof v === "object" && typeof target[k] === "object") {
updateWith(target[k], v);
} else {
target[k] = v;
}
}
}

答案 2 :(得分:0)
鉴于您引用了任意data.items[key]
个对象,您可以执行以下操作:
data.items[key] = Object.assign({}, data.items[key], updatedData.items[key]);
以上内容将使用新对象值替换旧对象值,并从原始对象复制属性并最终替换更新数据提供的任何属性。