2016-04-10 12 views
0

ネストされた連想配列を反復しようとしています。
すべての反復後、私はまたundefined値を取得:ネストされた連想配列を反復する

testarr = []; 

testarr["key1"] = []; 
testarr["key2"] = []; 

testarr["key1"].push("val1"); 
testarr["key1"].push("val2"); 
testarr["key1"].push("val3"); 

testarr["key2"].push("val4"); 
testarr["key2"].push("val5"); 
testarr["key2"].push("val6"); 

for (var key in testarr) { 
    console.log("---" + key + "---") 
    for (var key2 in key) { 
    console.log(testarr[key][key2]) 
    } 
} 

出力:

---key1--- 
val1 
val2 
val3 
undefined 
---key2--- 
val4 
val5 
val6 
undefined 

それはどこから来るのでしょうか?

+1

です期待して、あなた自身のプロパティではない列挙可能なプロパティを見つけるかもしれません。また、配列はオブジェクトですが、アルファベットではなく数字キーで使用することが期待されています。この場合、* testarr *の方がオブジェクトが適切と思われます。 – RobG

+0

@RobGこれは配列かオブジェクトですか? – John

+0

@ John- * testarr *は配列です。 – RobG

答えて

2

2番目のforループでは、 "testarr [key]"の代わりにインデックスである "key"を反復処理しています。これを行うための

for (var key in testarr) { 
    console.log("---" + key + "---") 
    for (var key2 in testarr[key]) { 
     console.log(testarr[key][key2]) 
    } 
} 
+0

配列で 'for.in'ループを避けるべきです。 – Andy

0

もう一つの方法は、プロパティが返される順序は何ではないかもしれないとして、配列を反復処理する* * FOR..INを使用することは推奨されません

Object.keys(testarr).forEach(k => {console.log("---" + k + "---"); 
Object.keys(testarr[k]).forEach(i => console.log(testarr[k][i]))}); 
+1

* testarr *のメンバで* Object.keys *を使用する必要はありません。* forEach *は数値インデックスを持つため直接使用できます。したがって、Object.keys(testarr).forEach(function(arr) {arr.forEach(...)}) '。 – RobG

+0

はい、そうです。私はちょうど減速することができなかった:)それで 'Object.keys(testarr).forEach(k => {console.log(" --- "+ k +" --- "); testarr [k] .forEach(i => console.log(i))}); ' – Redu

関連する問題