Javascript中引用的对象数组数组

时间:2016-05-06 05:33:13

标签: javascript arrays reference underscore.js

我有一个数组如下

var sample = [{a:1, b: 1, c:1}, {a:1, b: 1, c:1}, {a:1, b: 1, c:1}];

然后我运行以下代码并尝试groupsOfItems[0].sample[0].a = 10groupsOfItems[0].sample[0].agroupsOfItems[1].sample[0].agroupsOfItems[2].sample[0].a更改为10.

如何防止这种情况?



var sample = [{a:1, b: 1, c:1}, {a:1, b: 1, c:1}, {a:1, b: 1, c:1}];


    var groupsOfItems = [];

    for(let i = 0; i < 10; i++) {
        var item = {};
        item.sample = _.clone(sample);
        groupsOfItems.push(item);
    }



  groupsOfItems[0].sample[0].a = 10
  
  console.log(groupsOfItems[0].sample[0].a,groupsOfItems[1].sample[0].a,groupsOfItems[2].sample[0].a);
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
&#13;
&#13;
&#13;

3 个答案:

答案 0 :(得分:6)

您需要克隆对象,然后才能将其引用给数组的属性

替换

item.sample = sample;

item.sample = JSON.parse(JSON.stringify(sample));

请注意,当样本对象增长时,这种克隆方法效率会降低。尝试使用here显示的其他一些方法。

答案 1 :(得分:0)

as mentioned in this post

for(let i = 0; i < 10; i++) {
        var item = {};
        item.sample = $.extend(true, [], sample);
        groupsOfItems.push(item);
    }

答案 2 :(得分:0)

我会避免一般克隆对象。克隆对象只会在轨道下方的痛苦中结束。以下是我在过去没有克隆的情况下取得的相似之处。

CategoriesController

通过这种方式,您可以为它们分配所有修改容器,克隆问题就会消失。