javascript における多次元配列の初期化について

投稿者: Anonymous

javascriptにおける4次元配列についての質問です。以下のコードは動作します。

var dimension4 = {
  map: [[[['4th dimension']]]],
  put: function() {
    console.log(this.map[0][0][0][0]);
  }
};

dimension4.put();

ですが以下のコードは動作しません。

var dimension4 =
 {
    map: [[[[]]]],
    ini: function()
    {
        var i, j, m, n;
        for (i = 0; i<8; i++) { for (j = 0; j<8; j++) {
                for (m = 0; m<8; m++) { for (n = 0; n<8; n++) {
                        this.map[i][j][m][n] = '0';
                }}
        }}
        return this.map;
    }
 };

 dimension4.ini();

テスト環境は firefox( fire-bug ) です。
TypeError: this.map[i][j][m] is undefined が出力されます。何の問題もない初期化ルーチンのように私には見えます。どこに問題があるのでしょうかさっぱりわかりません。宜しくお願いします。

解決

一例として、map 関数を使って初期化する方法を参考までに載せておきます。

var dimension4 =
 {
    ini: function()
    {
      var arr = '0';
      for(var i=0;i<4;i++){
        arr = Array.apply(null, Array(8)).map(() => arr);
      }
      this.map = arr;
    }
 };

追記

見直してみて気が付いたのですが、上記のコードは shallow copy になっています。

dimension4.ini();
dimension4.map[0][0][0][0] = 1;

dimension4.map[0][0][1][0]
=> 1
dimension4.map[0][1][0][0]
=> 1
dimension4.map[1][0][0][0]
=> 1

つまり、配列の reference(参照)をコピーしています。

jQuery や Underscore.js にはオブジェクトを完全にコピーする(deep copy)メソッドがある様ですが、それらの代わりに JSON.parse(JSON.stringify(arr)) を使います。

arr = Array.apply(null, Array(8))
           .map(() => JSON.parse(JSON.stringify(arr)));

dimension4.map[0][0][0][0] = 1;
dimension4.map[0][0][1][0]
=> "0"
dimension4.map[0][1][0][0]
=> "0"
dimension4.map[1][0][0][0]
=> "0"
回答者: user9156

Leave a Reply

Your email address will not be published. Required fields are marked *