2015-10-16 60 views
0

我有一個默認的嵌套數組稱爲default_array,很簡單:如何在修改克隆數組的值時保留嵌套數組值?

default_array = [ 
     ["a", "b", "c"] 
]; 

我創建一個OBJ稱爲obj他的array屬性的值是default_array副本:

obj = { 

    "array" : default_array.slice(0) 
}; 

但是,當我修改了obj.array這樣一個元素:

obj.array[0][0] = "z"; 

此修改也是default_array。我想這個修改不會影響default_array。我想保留default_array

有什麼想法?

+0

嘗試'VAR副本= default_array.map(功能(E){申報表電子;});'然後使用'copy' – Tushar

+0

.MAP不IE8的支持。 – totoaussi

+0

使用[來自MDN的Pollyfill](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map#Polyfill)。這應該添加在問題中,IE8 – Tushar

回答

2

function copy(array) { 
 
    var result = []; 
 
    for (var i = 0, len = array.length; i < len; i++) { 
 
     result.push(array[i].slice()); 
 
    } 
 
    return result; 
 
} 
 

 
var default_array = [ 
 
    ["a", "b", "c"] 
 
]; 
 
var obj = { 
 
    "array": copy(default_array) 
 
}; 
 

 
obj.array[0][0] = 'z'; 
 
console.log(obj.array); 
 
console.log(default_array);

+0

擴展版本的情況下,如果在父數組不僅數組https://jsfiddle.net/_alexander_/o96hL8L9/1/ –

0

使用map一次或還是因爲你有一個嵌套/多維數組,你可以使用JSON.parse & JSON.stringify組合:

default_array = [ 
    ["a", "b", "c"] 
]; 
var newArray = default_array.map(function(arr) { 
    return arr.slice(); 
}); 
//Or you can use combination of JSON.parse & Stringify 
var newArray = JSON.parse(JSON.stringify(default_array)); 
obj = { 
    "array": newArray.slice(0) 
}; 
+0

地圖不支持IE8。沒有.map()和沒有jQuery是可能的? – totoaussi

+0

你可以使用'JSON.parse'和'JSON.stringify'的組合。參見編輯 –

+0

Nit:如果'default_array'的所有元素都不是數組,那麼這將不起作用。 – thefourtheye

0

這可能是矯枉過正您的問題,但如果你越來越多地運行它,考慮使用Immutable.js

它提供了高效的不可變數據類型....只需查看https://facebook.github.io/immutable-js/,例如使用庫的代碼。

0

你可以試試這個:

obj = { 
    "array" : JSON.parse(JSON.stringify(default_array)) 
};