2016-04-10 165 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

不建議使用* *的for..in遍歷數組作爲其屬性返回可能不是什麼爲了你期望和你可能會發現不屬於自己的屬性的枚舉屬性。此外,雖然陣列是對象,但它們預計會與數字鍵一起使用,而不是字母。在這種情況下,對象似乎更適合* testarr *。 – RobG

+0

@RobG這是一個數組還是一個對象? – John

+0

@ John- * testarr *是一個數組。 – RobG

回答

2

在第二個for循環中,您正在迭代「key」,它是索引,而不是「testarr [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

這樣做的另一種方式是

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