2014-07-15 21 views
1

我發現了一個行爲,當嘗試使用循環來改變對象中屬性的值時,我並沒有想到。如何更新循環內的對象屬性?

基本上,我聲明我的對象在循環之外。 然後我循環一個數值的數組,這些數值用於更新對象屬性。 在循環內部,我將當前對象狀態存儲在外部數組中。

結果是,不是讓一個數組包含一系列具有不同數值的對象,而是最終在每個存儲的對象中都有相同的數值。

這裏是小提琴http://jsfiddle.net/fAypL/1/

jQuery(function(){ 

    var object_container = []; 

    var numeric_values = [1, 2 , 3, 4]; 

    var my_object = {}; 


    jQuery.each(numeric_values, function(index, value){ 
     my_object['value'] = value; 
     object_container.push(my_object); 
    }); 

    jQuery.each(object_container, function(index, value){ 
     jQuery('#content').prepend(value['value']); 
    }); 

}); 

我希望得到1 2 3 4爲存儲在每個對象的值,但是,我得到的是4 4 4 4,這沒有任何意義對我來說。

這種行爲任何暗示是更受歡迎,感謝

回答

5

當代碼調用.push()並傳遞my_object,什麼東西被傳遞是參考對象。沒有複製。

因此,您已將四個引用推送到完全相同的對象到數組中。

JavaScript對象總是以引用的形式參與表達式。沒有其他方式來處理對象。因此,當您創建一個變量並將其值設置爲一個對象時,您確實將其值設置爲對該對象的引用。與參數傳遞一樣,以及對象可以出現在表達式中的任何地方。

在這種情況下,您可以非常輕鬆地創建新對象;只是my_object分配和推每次迭代新鮮:

object_container.push({ value: value }); 
+2

正確的,並且以固定,創建一個新的'my_object'每次迭代在'推'之前。 – rvighne

2

你周圍循環每次不創建一個新的對象 - 你是剛剛更新同現有對象和推動的引用對象數組。創建要像做一個新的對象:

my_object = { 'value': value }; 
object_container.push(my_object); 

在這種情況下,你現在會得到更多的東西像你所期待的。看到更新的小提琴在這裏:http://jsfiddle.net/fAypL/2/

祝你好運!

還有一個想法(克隆!) - 如果您真的被綁定到每次使用相同的對象,只需克隆該對象,然後再添加到數組中。 that here有一個很好的解決方案。

0

您正在使用jQuery的,所以如果你想要的是不影響在原來的樣子合併:

var both_obj = $.extend({}, default_obj , adding_obj); 

這將使您的原始對象改變了,也很好用的copy

jquery docs - extend()

0

另一種版本是使用具有一個構造方法的對象和所述關鍵字new

var object_container = []; 
var numeric_values = [1, 2 , 3, 4]; 

function MyObject(value) 
{ 
    this.value = value; 
} 


jQuery.each(numeric_values, function(index, value){  
    object_container.push(new MyObject(value)); 
}); 

jQuery.each(object_container, function(index, value){ 
    jQuery('#content').prepend(value['value']); 
}); 

Fiddle