2013-10-22 23 views
33

Ich versuche, durch die folgende Schleife:Javascript Schleife durch Objekt-Array?

{ 
    "messages": [{ 
     "msgFrom": "13223821242", 
     "msgBody": "Hi there" 
    }, { 
     "msgFrom": "Bill", 
     "msgBody": "Hello!" 
    }] 
} 

Ich möchte msgFrom und msgBody

Ich habe versucht, abzurufen:

druckt
 for (var key in data) { 
      var obj = data[key]; 
      for (var prop in obj) { 
       if(obj.hasOwnProperty(prop)){ 
       console.log(prop + " = " + obj[prop]); 
       } 
      } 
     } 

Aber das Konsolenprotokoll [Object]

Irgendwelche Ideen, was ich falsch mache?

+1

' console.log (obj, Prop); ' – zerkms

+3

[Sie werden in der Regel wollen um zu vermeiden, 'for..in' für' Array's zu verwenden.] (http: // stackoverflow.com/questions/500504/why-is-mit-in-mit-array-iteration-wie-a-bad-idee) –

+0

Der einzige glaubwürdige Grund, for..in mit einem Array nicht zu verwenden, ist, dass die Eigenschaften möglicherweise nicht in der erwarteten Reihenfolge zurückgegeben werden. Ansonsten ist es nicht besser oder schlechter, als for..in auf einem anderen Objekt zu verwenden (unerwartete Eigenschaften, Eigenschaften aus dem [[[Prototyp]] ', usw.). – RobG

Antwort

67

Es scheint, dass Sie nur die "messages" Eigenschaft im data verpasst haben, so wird die Schleife wahrscheinlich das Iterieren root Object statt der Array:

for (var key in data.messages) { 
    var obj = data.messages[key]; 
    // ... 
} 

Sofern data zu messages vor dem gegebenen snippet gesetzt wurde.

Obwohl, sollten Sie bedenken, dass zu einem normalen for Schleife für die Array Wechsel:

for (var i = 0, l = data.messages.length; i < l; i++) { 
    var obj = data.messages[i]; 
    // ... 
} 
+0

Danke, dass du mir geholfen hast, auch zu einer normalen For-Schleife zu wechseln! So schnell wie möglich annehmen. – Alosyius

+1

Warum sollte er eine normale For-Schleife verwenden? –

+1

@TravisHeeter 'for..in' behandelt das Array als einfaches Objekt, wobei alle aufzählbaren Schlüssel in einer nicht garantierten Reihenfolge durchlaufen werden und nicht nur die Indizes '0' bis 'Länge - 1'. Manchmal kann das sogar erwünscht sein. Normalerweise nicht. - [Warum ist "für ... in" mit Array-Iteration eine schlechte Idee?] (Https://stackoverflow.com/questions/500504/why-isusing-for-in-in-wrapar-iteration-a (Bad-Idee) –

9

In Ihrem Skript sind Daten Ihr gesamtes Objekt.

Schlüssel ist, „Botschaften“, das ist ein Array, das Sie wie folgt durchlaufen müssen:

for (var key in data) { 
     var arr = data[key]; 
     for(var i = 0; i < arr.length; i++) { 
      var obj = arr[ i ]; 
      for (var prop in obj) { 
       if(obj.hasOwnProperty(prop)){ 
        console.log(prop + " = " + obj[prop]); 
       } 
      } 
     } 
    } 
0

Um den Inhalt des einzelnen Array, die ein oder mehr Objekte, dh alles, was in den Klammern von so etwas wie diese {Nachrichten Referenz: [{ "a": 1 , "b": 2}]}, fügen Sie einfach [0] zur Abfrage hinzu, um das erste Array-Element zu erhalten

z Nachrichten [0] verweisen auf das Objekt {"a": 1, "b": 2} im Gegensatz zu nur Nachrichten, die das gesamte Array [{"a": 1, "b": 2 }]

von dort können Sie mit dem Ergebnis als typisches Objekt arbeiten und verwenden Sie Object.keys zum Beispiel, um "a" und "b" zu erhalten.

1

Die vorgeschlagene for-Schleife ist ziemlich gut, aber Sie müssen die Eigenschaften mit hasOwnProperty überprüfen. Ich würde eher vorschlagen Object.keys() mit, dass nur Renditen eigenen Eigenschaften "des Objekts (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys)

var data = { 
 
    "messages": [{ 
 
     "msgFrom": "13223821242", 
 
     "msgBody": "Hi there" 
 
    }, { 
 
     "msgFrom": "Bill", 
 
     "msgBody": "Hello!" 
 
    }] 
 
}; 
 

 
data.messages.forEach(function(message, index) { 
 
    console.log('message index '+ index); 
 
    Object.keys(message).forEach(function(prop) {  
 
     console.log(prop + " = " + message[prop]); 
 
    }); 
 
});

Verwandte Themen