2012-03-14 8 views
3

なぜmyarray [bla] [bl]は常にNaNですか? 1次元(myarray [bla])で同じことをすると、その数が得られます。NaNを返す配列の配列

var bla = 'blabla'; 
var bl = 'bla'; 
var myarray = []; 
for (i = 0; i < 10; i++) { 
    if (!myarray[bla]) { 
     myarray[bla] = []; 
    } 
    myarray[bla][bl] += i; 
    console.log(myarray[bla][bl] + " + " + i); 
}​ 
+0

myarray [bla] [bl]が設定されていないため... – scibuff

+0

'undefined + 0'は' NaN'です。 – pimvdb

答えて

3

さて、変数のインスタンスを置き換えてループを進めましょうの文字列値を持つ:JavaScriptで

if (!myarray['blabla']) { 
    myarray['blabla'] = []; 
} 

配列は整数値によってインデックスされています。ここであなたのコードが行っているのは、配列インスタンスにexpandoプロパティを追加することです。つまり:

myarray.blabla = []; 

今あなたのインクリメント文を再考:

myarray['blabla'][bl] += i; 

か、はExpando特性を有する:これが何をしようとしている何

myarray.blabla.bl // remember that "myarray.blabla" is set to the empty array above 

は、名前付きblのプロパティにアクセスで空の配列だからこそ、あなたはundefinedになっています。

とにかく、ハッシュテーブルのようなjavascriptで配列を使用するのは避けたいと思うかもしれません。このような問題は十分な時間が経過してしまうためです。

+0

javascriptのハッシュテーブルのベストプラクティスはJSONでしょうか?私は、あなたが知る必要があるハッシュがあるperlの背景から来ています。 – David

+1

+1素晴らしいと非常にいい説明 – fguillen

+0

@ダビデ - 種類 - 実際にはJSONオブジェクトとjavascriptオブジェクトの違いは、ここで私がこれまで以上に詳しく説明:http://stackoverflow.com/questions/6489783/一般的には、単純なオブジェクトインスタンスをハッシュテーブルとして使用することがあります。この* *が動作しない1つの注目すべき例外は、カスタムオブジェクト型のように、ハッシュテーブルのキー型が単純な文字列以外の場合です。このページには、なぜオブジェクト/配列がそれらのやり方で動作するのかについての素敵な説明があります:http://www.timdown.co.uk/jshashtable/ – matt

0

我々は少しを展開すると、私はあなたが問題を見ることを願って、

if (!myarray[bla]) { 
    myarray[bla] = []; 
} 
myarray[bla][bl] = myarray[bla][bl] + i; 

ヒント:myarray[bla][bl] = undefined

0

myarray[bla][bl]が...設定されていないため、あなたは

if (!myarray[bla][bl]){ myarray[bla][bl] = 0; } 
が必要
関連する問題