2013-10-22 21 views
33

Próbuję pętli następującym:Pętla JavaScript przez tablicę obiektów?

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

chcę pobrać msgFrom i msgBody

Próbowałem:

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

Ale dziennika konsola wydruki [Object]

Wszelkie pomysły, co robię źle?

+1

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

+3

[Musisz generalnie chcą aby uniknąć użycia 'for..in' dla' Array's.] (http: // stackoverflow.com/questions/500504/why-is-using-for-in-with-array-iteration-a-bad-idea) –

+0

Jedynym wiarygodnym powodem, dla którego nie należy używać dla..in z tablicą jest to, że właściwości mogą nie zostaną zwrócone w oczekiwanej kolejności. W przeciwnym razie nie jest ani gorszy, ani lepszy od używania dla ... w jakimkolwiek innym Objectie (nieoczekiwane właściwości, właściwości z '[[Prototype]]', itp.). – RobG

Odpowiedz

67

Wydaje może po prostu brakowało właściwość w data"messages", więc pętla jest prawdopodobne iteracji korzeń Object zamiast Array:

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

ile data została ustawiona messages przed danym fragmencie.

Chociaż, należy rozważyć zmianę, że do normalnego for pętli dla Array:

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

Dziękuję za pomoc w zmianie pętli! Zaakceptowanie jak najszybciej. – Alosyius

+1

Dlaczego powinien rozważyć użycie normalnej pętli 'for'? –

+1

@TravisHeeter 'for..in' traktuje tablicę jako zwykły obiekt, iterując wszystkie przeliczalne klucze w kolejności, która nie jest gwarantowana, a nie tylko jej indeksy, od' 0' do 'length - 1'. Czasami może to faktycznie być pożądane. Zazwyczaj nie. - [Dlaczego używasz "dla ... w" z iteracją tablicy zły pomysł?] (Https://stackoverflow.com/questions/500504/why-is-using-for-in-with-array-iteration-a -bad-idea) –

9

W twoim skrypcie dane to cały twój obiekt.

kluczem jest „Wiadomości”, który jest tablicą trzeba iterację tak:

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

odwoływać się do zawartości pojedynczej macierzy zawierającego jeden lub więcej obiektów, czyli wszystko, co w nawiasie czegoś takiego {messages: [{ "a": 1 , "b": 2}]}, wystarczy dodać [0] do zapytania, aby uzyskać pierwszy element tablicy

np. komunikaty [0] będą odwoływać się do obiektu {"a": 1, "b": 2} w przeciwieństwie do tylko wiadomości, które odwołują się do całej tablicy [{"a": 1, "b": 2 }]

stamtąd możesz pracować z wynikiem jako typowym obiektem i użyć Object.keys na przykład aby uzyskać "a" i "b".

1

Sugerowana pętla jest całkiem w porządku, ale musisz sprawdzić właściwości za pomocą hasOwnProperty. Wolałbym sugerują użyciu Object.keys() że zwraca tylko '' własne właściwości obiektu (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]); 
 
    }); 
 
});

Powiązane problemy