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