【问题标题】:How to ensure properties of two separate javascript objects are linked如何确保两个单独的 javascript 对象的属性被链接
【发布时间】:2017-01-17 06:12:24
【问题描述】:

我在 anuglar 服务中有 2 个对象,我想分配一个名为 nodes 的属性,该属性指向同一个数组。这是正确的方法吗?我没有看到当我对 1 个对象上的节点进行更改时,另一个对象正在更改

objectOne.nodes = [o1, o2, o3];
objectTwo.nodes = [];
angular.forEach(objectOne.nodes, function(n){
    objectTwo.nodes.push(n); // based on some logic not all n assigned to the objectTwo, some might go to objectThree.
})

现在,如果我更改 objectTwo.nodes[i],我希望这适用于 objectOne.nodes[j],其中 i 和 j 是 2 个不同对象中同一节点的索引(因为排序可能不匹配),但我是没有看到这个。当我将节点推送到objectTwo 时,我做错了什么吗?

PS:我正在对 DOM 上的 objectTwo 节点进行更改,并且 objectOne 和 ObjectTwo 都在我的服务的 mem 变量中。

【问题讨论】:

  • 你为什么不直接做 - objectTwo.nodes = objectOne.nodes,这样你就可以通过引用传递它
  • 否,因为我想使用逻辑来选择哪些节点继续在 objectTwo、objectThree 或 objectFour 等...
  • 对 1 个对象上的节点进行更改,另一个对象正在更改 - 我想您指的是$scope.$watch?回调函数类似于angular.forEach
  • 我对在 DOM 上呈现的 objectTwo 进行了更改。我希望 objectOne 的内存值能够自动获取该值,因为 objectOne 和 objectTwo 都指向内存中的同一个节点,而无需自己使用 watch 和更新这些节点。
  • “节点”属性不是“相同”数组。要获得预期结果,请阅读 naortor 的评论。

标签: javascript angularjs arrays pass-by-reference


【解决方案1】:

一点帮助:

var div = document.createElement("div");
var a = {}, b = {};
a.nodes = b.nodes = [];
a.nodes.push(div);
div.style.color = "blue";
console.log(a.nodes[0].style.color);
console.log(b.nodes[0].style.color);
div.style.color = "red";
console.log(a.nodes[0].style.color);
console.log(b.nodes[0].style.color);

【讨论】:

  • 此解决方案不适用于我的情况,因为我需要在不同对象之间拆分节点元素。
  • @armensg90 我不明白:-|
  • 也许我错了。我可以使用您在 objectOne 上已定义的节点数组的解决方案吗?
  • 我只想将它们的一个子集分配给 objectTwo
  • @armensg90 好的,我明白了,你确实需要2个不同的数组,然后你必须自己管理添加和删除。
【解决方案2】:

如果你推送对象的相同引用,新数组也应该影响源。

var objectOne = {}, objectTwo = {}, objectThree = {};

objectOne.nodes = [{ id: 1, name: 'o1' }, { id: 2, name: 'o2' }, { id: 3, name: 'o3' }];
objectTwo.nodes = [];
objectThree.nodes = [];

objectOne.nodes.forEach(function (o) {
    o.id % 2 ? objectTwo.nodes.push(o) : objectThree.nodes.push(o);
});

objectTwo.nodes[1].name += '+';

console.log(objectOne);
console.log(objectTwo);
console.log(objectThree);
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

  • 谢谢尼娜,这是我所期望的,但不幸的是我没有看到。您认为这是因为 angular.forEach() 还是我使用的库 (handsontable) 将节点绑定到 DOM 的方式?
  • 我想,dom 元素的行为不像普通对象。在这种情况下,我将收集 id 之类的引用 - 对于更改,我将使用引用并进行一些 dom 更改,引用指向的位置。
  • 对 DOM 的更改肯定会更新 objectTwo,但这些不会“传播”到 objectOne
猜你喜欢
  • 2016-07-18
  • 2017-09-28
  • 1970-01-01
  • 2010-09-17
  • 1970-01-01
相关资源
最近更新 更多