2016-04-10 20 views
0

Ich versuche, ein verschachteltes assoziatives Array zu iterieren.
Nach jeder Iteration ich auch einen undefined Wert:Iteration verschachteltes assoziatives Array

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]) 
    } 
} 

Ausgang:

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

Wo es her?

+1

Es ist nicht * for..in * zu verwenden, empfehlen Sie ein Array wie die Reihenfolge iterieren, in denen Eigenschaften zurückgegeben werden kann nicht sein, was erwarten und Sie können aufzählbare Eigenschaften finden, die keine eigenen Eigenschaften sind. Auch wenn Arrays Objekte sind, wird erwartet, dass sie mit numerischen Schlüsseln und nicht alphabetisch verwendet werden. Ein Objekt scheint in diesem Fall für * testarr * geeigneter zu sein. – RobG

+0

@RobG Ist das ein Array oder ein Objekt? – John

+0

@ John- * testarr * ist ein Array. – RobG

Antwort

2

In der zweiten for-Schleife, iterieren Sie über "Schlüssel", der der Index ist, anstelle von "testarr [key]".

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

Sie sollten 'for.in' Schleifen mit Arrays vermeiden. – Andy

0

Eine andere Möglichkeit, dies zu tun, ist

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

Es müssen keine * Object.keys * auf den Mitgliedern von * testarr * verwendet werden, Sie können * forEach * direkt auf ihnen verwenden, da sie numerische Indizes haben, also 'Object.keys (testarr) .forEach (function (arr) {arr.forEach (...)}) '. – RobG

+0

Ja, du hast recht .. + dafür. Ich konnte einfach nicht langsamer werden :) Dann wäre es etwas kürzer wie 'Object.keys (testarr) .forEach (k => {console.log (" --- "+ k +" --- "); testarr [k] .forEach (i => console.log (i))}); ' – Redu