2016-05-06 148 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 

這樣你就可以爲它們分配所有的容器,克隆的問題就消失了。