二次元配列のコピー

Javascript の二次元配列をコピーします。

配列の参照

【実行画面】


【Source Code】
<script type="text/javascript">
var ary = [[11, 12, 13, 14], [21, 22, 23, 24], [31, 32, 33, 34]];
var copied = ary;
ary[0][1] = 98;
ary[1][2] = 99;
document.write(copied);
</script>

var ary で二次元配列を定義して、var copied = ary; でコピーします。
コピーした後で ary[1][2] に 99 を代入して copied を印字します。
ary と copied は同じ領域を参照しているので、copied の値も 99 に変わります。

二次元配列の一部をコピー

【実行画面】


【Source Code】
<script type="text/javascript">
var ary = [[11, 12, 13, 14], [21, 22, 23, 24], [31, 32, 33, 34]];
var copied = ary[0].slice();
ary[0][1] = 98;
ary[1][2] = 99;
document.write(copied);
</script>

var copied = ary[0].slice(); でコピーすると二次元配列の一番目だけがコピーされます。
slice() を使うとディープコピーされるので ary[0][1] = 98; で ary を変更しても影響されません。

ディープコピー

【実行画面】


【Source Code】
<script type="text/javascript">
var ary = [[11, 12, 13, 14], [21, 22, 23, 24], [31, 32, 33, 34]];
var copied = new Array(3);
for(i=0; i<3; i++)
{   copied[i] = ary[i].slice();
}
ary[0][1] = 98;
ary[1][2] = 99;
document.write(copied);
</script>

var ary で二次元配列を定義します。
var copied = new Array(3); で一次元配列を定義して、それぞれの要素に ary[i].slice(); で実態をコピーします。
コピーした後で ary[0][1] = 98; ary[1][2] = 99; を代入して copied を印字します。
ary と copied は別の領域なので ary の影響は受けません。

前田稔の超初心者のプログラム入門
超初心者のプログラム入門(JavaScript)