2012-02-24 44 views
2

我有這個(子)對象叫做products.original爲什麼我的原始對象在我將其「複製」到一個新對象後受到影響?

然後我解壓到一個新的對象調用productArray

var productArray = []; 

productArray = products.original; 

/*some calculations here*/ 

//sort the object by lowest score 
productArray.sort(function(a, b) {return a.score - b.score;}); 

最後,我在productArray前三細胞中提取到名爲resultArray的第三個目的:

var resultArray= [];   
resultArray = productArray.splice(0,3); 

令我驚訝的是,這減少了3(拼接)的長度products.original。爲什麼?我該怎麼做才能阻止呢?提前致謝。

+2

你應該擺脫'= []'。如果要在下一行中將不同的數組分配給該變量,則創建數組並將其分配給變量沒有意義。 – Quentin 2012-02-24 10:25:16

回答

2

您沒有複製數組,而僅僅是對它的引用。因此,您的所有操作仍在原始對象上執行。 真正的克隆使用slice

productArray = products.original.slice(0); 
+0

只是在代碼中看到.splice和no .slice。 – Sirko 2012-02-24 10:24:53

+0

謝謝,我的錯。 – pimvdb 2012-02-24 10:25:15

2

試試這個方法:

productArray = products.original.slice(); 

在JavaScript對象是通過引用傳遞。

2

splice

改變陣列的內容,增加新的元件,同時除去舊元件。

你想slice

返回數組的一部分的一個層次的深層複製。

0

這是預期的JavaScript。 這post將幫助你解決你的問題。

0

productArray = products.original; 

犯規實際上覆制products.original到productArray。相反,它複製一個參考。這意味着每次您更改productArray時,您也正在更改原始對象。爲了(深)複製一個嵌套的對象,你必須做一些複雜的事情,比如迭代對象的成員,檢查它們是數組還是對象(將被引用複製),遍歷這些對象並複製簡單數據類型。另一種方法是使用提供複製功能的下劃線或jquery。從你的排序功能來看,你的數組只包含數字。在這種情況下,slice將會訣竅。

請參閱這裏的jQuery例子(Deep) copying an array using jQuery

相關問題