2次元配列のコピー::JavaScript

配列の中身のコピーは.slice()を使えば出来る。
しかし、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
二重ループでそれぞれの値を代入していってもいいが、多少は簡潔に書ける。

コメント

このブログの人気の投稿

iframeの利点と欠点

Cocos2d-x 3.4でandroid向けにビルドする