2次元配列のコピー::JavaScript
配列の中身のコピーは.slice()を使えば出来る。
しかし、2次元配列など、配列の中身が配列の時は、参照がコピーされてしまう。
例えば、
しかし、2次元配列など、配列の中身が配列の時は、参照がコピーされてしまう。
例えば、
var array = new Array(3);
var copied = new Array(3);
for(i=0;i<3;i++){
array[i] = new Array(3);
copied[i] = new Array(3);
for(j=0;j<3;j++){
array[i][j] = 0;
copied[i][j] = 0;
}
}
copied = array.slice();
console.log("before array:",array[0][0]);
copied[0][0] = 1;
console.log("after array:",array[0][0]);
console.log("before copied:",copied[0][0]);
array[0][0] = 2;
console.log("after copied:",copied[0][0]);
というようにすると、一方の配列を書き換えるともう一方も変わってしまう。(と言うより同じものを参照している)
before array: 0 after array: 1 before copied: 1 after copied: 2ので、
var array = new Array(3);
var copied = new Array(3);
for(i=0;i<3;i++){
array[i] = new Array(3);
copied[i] = new Array(3);
for(j=0;j<3;j++){
array[i][j] = 0;
copied[i][j] = 0;
}
}
for(i=0;i<3;i++){
copied[i] = array[i].slice();
}
console.log("before array:",array[0][0]);
copied[0][0] = 1;
console.log("after array:",array[0][0]);
console.log("before copied:",copied[0][0]);
array[0][0] = 2;
console.log("after copied:",copied[0][0]);
というようにループを使って配列内の各配列を.slice()を使ってコピーすると配列内の実態が複製される。
before array: 0 after array: 0 before copied: 1 after copied: 1二重ループでそれぞれの値を代入していってもいいが、多少は簡潔に書ける。
コメント