如何在Javascript中添加/替换嵌套对象中的值(不丢失原始引用)?

时间:2016-05-12 14:23:46

标签: javascript angularjs object data-structures

我必须使用新数据更新嵌套对象,而不会丢失原始对象中的引用。我认为我的问题最好用一个例子来解释:

原始对象:

{
  "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实现,我很乐意看到它,以便我可以从代码中学习。

实现此目标的最有效方法是什么?

2 个答案:

答案 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。