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二重ループでそれぞれの値を代入していってもいいが、多少は簡潔に書ける。
コメント