2014-06-24 71 views
0

我有對象的數組作爲JavaScript數組按值傳遞不工作

var obj = {'name': 'John'}; 
var obj2 = {'name': 'Sam'}; 
var arr = []; 
arr.push(obj); 
arr.push(obj2); 

現在我創建一個新的數組arr2作爲

arr2 = arr.slice(); 

現在,如果我改變arr2[0]['name'] = 'David';

然後arr1[0]['name']也變成'David';

arr2對象值更改時,我們如何防止arr的任何對象值發生更改。

+3

您正在克隆數組,但不是對象;他們仍然是參考。 – elclanrs

+0

有沒有一種方法可以防止物體發生變化?什麼是更好的方法 – user544079

+1

您正在尋找** deep **克隆/複製:http://stackoverflow.com/search?q=%5Bjavascript%5D+array+deep+copy,https://www.google .com/search?q = javascript%20deep%20copy –

回答

1

你必須克隆每個對象,不只是數組:

function cloneObject(obj) { 
    var result = {}; 

    for (var k in obj) { 
     if (Object.prototype.hasOwnProperty.call(obj, k)) { 
      result[k] = obj[k]; 
     } 
    } 

    return result; 
} 

var arr2 = arr.map(cloneObject); 

有沒有我們可以防止對象更改的方法嗎?

是的,有Object.freeze

arr.forEach(Object.freeze); 
+0

爲什麼不只是'if(obj.hasOwnProperty(k))'? – elclanrs

+0

@elclanrs:這只是爲了將用戶輸入用作字典的鍵;他們可以鍵入'hasOwnProperty'並打破一切。它通常不需要擔心,但效用函數應該是健壯的,畢竟=) – Ryan

0

當你複製你只在陣列中複製該數組,但這些值是對對象的引用。您最終得到兩個單獨的數組,但引用了相同的對象。

你需要做一個深拷貝,即在每一級的所有內容複製:

var arr2 = JSON.parse(JSON.stringify(arr)); 

現在你有數組中有一個完全獨立的副本,應有盡有。