この単純なコードは、1 次元の配列では機能しますが、多次元の配列では機能しません。
var a=[[0,0,0],[0,0,0],[0,0,0]];
var b=a.slice(0);
a[0][0]=2;
alert(b[0][0]);//Should display 0, but displays 2
多次元配列を複製するにはどうすればよいですか?
編集:この例では、次元は 2 ですが、実際の配列の次元は 4 です
この単純なコードは、1 次元の配列では機能しますが、多次元の配列では機能しません。
var a=[[0,0,0],[0,0,0],[0,0,0]];
var b=a.slice(0);
a[0][0]=2;
alert(b[0][0]);//Should display 0, but displays 2
多次元配列を複製するにはどうすればよいですか?
編集:この例では、次元は 2 ですが、実際の配列の次元は 4 です
これは、任意の深さで機能する一般的なソリューションであり、配列が実際には配列であり、配列のようなオブジェクトではないことを前提としています。
function clone(arr) {
arr = arr.slice()
for (var i = 0; i < arr.length; i++)
if (Array.isArray(arr[i]))
arr[i] = clone(arr[i])
return arr
}
Array.isArray
古いブラウザーでは、必要に応じてメソッドをシムすることができます。
if (!Array.isArray) {
Array.isArray = function(arr) {
return Object.prototype.toString.call(arr) === "[object Array]"
}
}
function clone(arr) {
return arr.map(function(item) {
if (Array.isArray(item))
return clone(item)
return item
})
}
.map()
代わりに使用するソリューションを次に示します。
var b=a.map(function(arr) { return arr.slice(); });
クローンを作成する最も簡単な方法は、
function clone(array){
return JSON.parse(JSON.stringify(array));
}
関数と循環変数がある場合を除き、すべて/任意の次元で機能します。
あなたは参照を複製しているだけです..ループを使用してください
var a=[[0,0,0],[0,0,0],[0,0,0]];
var b= new Array()
for(i=0;i<a.length;i++)
b[i]=a[i].slice(0);
a[0][0] = 2
alert(b[0][0]);
alert(a[0][0]);