我必须使用新数据更新嵌套对象,而不会丢失原始对象中的引用。我认为我的问题最好用一个例子来解释:
原始对象:
{
"one": 1,
"two": {
"three": 3,
"four": {
"five": 5
}
}
}
更新对象:
{
"two": {
"three": 5,
"four": {
"five": 7,
"new": 8
}
}
}
最终对象:(同时保留原始对象中的引用)
{
"two": {
"three": 5,
"four": {
"five": 7,
"new": 8
}
}
}
因此虽然看起来像 Update 对象和 Final 对象完全相同,但需要注意的是我必须保留原始对象的引用(即我不要替换"两个"对象或"四"对象在" two"对象中,仅更新他们的价值观)。
保留引用的原因是因为我使用数据结构在AngularJS中创建了各种绑定。我尝试使用angular.copy
,但它没有给我预期的效果。此外,如果有一个纯粹的JS实现,我很乐意看到它,以便我可以从代码中学习。
实现此目标的最有效方法是什么?
答案 0 :(得分:2)
也许这适合你。首先删除不需要的密钥,然后更新值。
function deep(o, u) {
var keysO = Object.keys(o),
keysU = Object.keys(u);
keysO.forEach(function (k) {
if (-1 === keysU.indexOf(k)) {
delete o[k];
}
});
keysU.forEach(function (k) {
if (u[k] !== null && typeof u[k] === 'object') {
if (o[k] === null || typeof o[k] !== 'object') {
o[k] = {};
}
deep(o[k], u[k]);
return;
}
o[k] = u[k];
});
}
var original = { one: 1, two: { three: 3, four: { five: 5 } } },
update = { two: { three: 5, four: { five: 7, "new": 8 } } };
deep(original, update);
console.log(original);
答案 1 :(得分:0)
克隆对象,然后更新所需的属性。
对象通过引用传递,因此应该克隆它。
要克隆:
Object.assign(target, sources...);
var originalObj = {a: 1, b: 2, c: 3};
var updatedObj = {};
Object.assign(updatedObj, originalObj);
现在您可以更新updatedObj并保留originalObj。