

これだとダメで

[code]

    var histArray = new Array(256);
    var histData = [histArray,histArray,histArray];
    for(i = 0; i < 3; i++){
        for(j = 0; j < 256; j++){
            histData[i][j] = 0;
        }
    }
    
[/code]

こっちだとちゃんと初期化されるんですが、これはなぜでしょうか？

[code]

    var histData = [histArray,histArray,histArray];
    for(j = 0; j < 3; j++){
        histData[j] = new Array(256);
        for(i = 0; i < 256; i++){
            histData[j][i] = 0;
        }
    }
    
[/code]


CC BY-SA 3.0
2015-01-06T06:29:23.680
3170
2015-03-02T18:34:27.177
2015-01-06T08:01:11.317
4978
112
question
javascript
Javascript での多次元配列の初期化について


> var histData = [histArray,histArray,histArray];

histArray のインスタンス(実体)はただ一つですので、これでは常に

[code]

    histData[0][n] == histData[1][n] == histData[2][n] == histArray[n]
    
[/code]

となってしまいます。例えば histData[0][1] に値を代入すると、histData[1][1] と histData[2] [1] と
histArray[1] もその値と同じになってしまいます(全て同じインスタンスを指しているからです)。

ですので、以下の様にして初期化する必要があります。

[code]

    var histData = [new Array(256), new Array(256), new Array(256)];
    
[/code]


CC BY-SA 3.0
2015-01-06T07:03:53.857
3174
2015-01-06T07:03:53.857
3170
answer


1つめのコード例では `histData[0]`, `histData[1]`, `histData[2]`
がすべて同じ入れ物を指しています。したがって、1つめのコード例で初期化した `histData[n][m]` を使おうとするとおかしなことになります。

2つめのコード例では3行目の `new Array(256)` で新しい入れ物を用意していますので `histData[0]`,
`histData[1]`, `histData[2]` はすべて別々の入れ物を指すことになります。なので、思ったように使えるようになります。


CC BY-SA 3.0
2015-01-06T07:10:20.693
3175
2015-01-06T07:10:20.693
3160
3170
answer


JavaScript 1.7 なら配列内包っていう便利なのがあるんだけどね

[code]

    function range(begin, end) {
      for (let i = begin; i < end; i++) {
        yield i;
      }
    }
    
    var histData = [[0 for each(j in range(0, 256))] for each(i in range(0, 3))];
    
[/code]


CC BY-SA 3.0
2015-03-02T18:34:27.177
7336
2015-03-02T18:34:27.177
8610
3170
answer