2016-05-06 110 views
4

引用我有一个数组如下数组对象数组的Javascript中

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);
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>

+1

我为你创建了一个片段。请在将来这样做。测试代码时节省大量时间 – mplungjan

+0

请谨慎使用库克隆对象(或者一般情况下)。如果在克隆的对象上调用方法,该方法仍将引用原始对象,并将修改原始对象,而不是克隆的对象。 –

回答

6

你需要assiging其referece到阵列的属性之前克隆对象

更换

item.sample = sample; 

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

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

+0

我用_.clone尝试过。没有帮助 –

+0

@JaseemAbbas是否尝试了我共享的方法 – gurvinder372

+1

@JaseemAbbas'_.clone()'是一个*浅拷贝*。 JSON方法执行*深度克隆*。 –

0

as mentioned in this post

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

我会避免克隆对象一般。克隆对象往往只会导致痛苦进一步恶化。以下是我在过去没有克隆的情况下取得类似情况的方法。

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

var Item = function(a, b, c) { 
    this.a = a; 
    this.b = b; 
    this.c = c; 
} 

for (let i = 0; i < 10; i++) { 
    var item = {}; 
    item.sample = _.map(sample, function(item) { 
    return new Item(item.a, item.b, item.c) 
    }); 
    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); 
//10 1 1 

这样你就可以为它们分配所有的容器,克隆的问题就消失了。