- ベストアンサー
JavaScript配列のコピーについての質問
- JavaScriptにおける配列のコピーについて質問です。配列のコピーは破壊・非破壊の区別がありますが、非破壊のコピーをしたい場合はArray.prototype.clone関数を使用することができます。
- ただし、3次元配列の場合、このclone関数は破壊的になる可能性があります。例えば、コピーした配列のデータを変えると元の配列も変わってしまいます。
- 質問者はaaaという3次元配列をbbbにコピーしたいと思っており、var bbb; bbb = aaa.clone();と記述しています。しかし結果的には破壊的なコピーになってしまい、元の配列も変化してしまいます。この問題の解決策について教えてください。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
コピーが必要なら新たなArrayオブジェクトを作成してこちらを返すようにしないといけないでしょう Array.Prototype.clone = function() { // 自分自身が配列かをチェック if ( this[0].constructor == Array ) { var ar, n; // 新しい配列を用意する ar = new Array( this.length ); for ( n = 0; n < ar.length; n++ ) { // 再起呼び出しで配列の中身をコピー ar[n] = this[n].clone(); } // 作成した配列を返す return ar; } return Array.apply( null, this ); } といった具合でうまくいくようです var aaa, bbb, ccc; aaa = new Array(); aaa[0] = new Array(); aaa[1] = new Array(); aar[0][0] = new Array(1,2); aar[0][1] = new Array(3,4); aar[1][0] = new Array(5,6); aar[1][1] = new Array(7,8); bbd = aaa.clone(); ccc = aaa; ccc[0][0][0] = -1; alert( aaa[0][0][0] + "\n" + bbb[0][0][0] + "\n" + ccc[0][0][0]); とすると aaaとcccは-1、bbbは1となっていると思います
お礼
できました。。 完璧ですね。再起呼び出しですね、ポイントは! ありがとうございました。