Ciclo di JavaScript attraverso json array?

Sto cercando di scorrere il seguente array JSON:

{ "id": "1", "msg": "hi", "tid": "2013-05-05 23:35", "fromWho": "[email protected]" }, { "id": "2", "msg": "there", "tid": "2013-05-05 23:45", "fromWho": "[email protected]" } 

E ho provato quanto segue

  for (var key in data) { if (data.hasOwnProperty(key)) { console.log(data[key].id); } } 

Ma per qualche ragione sto ottenendo solo la prima parte, i valori di id 1.

Qualche idea?

Il tuo JSON dovrebbe assomigliare a questo:

 var json = [{ "id" : "1", "msg" : "hi", "tid" : "2013-05-05 23:35", "fromWho": "[email protected]" }, { "id" : "2", "msg" : "there", "tid" : "2013-05-05 23:45", "fromWho": "[email protected]" }]; 

Puoi eseguire il loop sull’array in questo modo:

 for(var i = 0; i < json.length; i++) { var obj = json[i]; console.log(obj.id); } 

O come questo (suggerito da Eric) fai attenzione con il supporto di IE

 json.forEach(function(obj) { console.log(obj.id); }); 

Ci sono alcuni problemi nel codice, in primo luogo il tuo json deve apparire come:

 var json = [{ "id" : "1", "msg" : "hi", "tid" : "2013-05-05 23:35", "fromWho": "[email protected]" }, { "id" : "2", "msg" : "there", "tid" : "2013-05-05 23:45", "fromWho": "[email protected]" }]; 

Successivamente, puoi ripetere l’iter in questo modo:

 for (var key in json) { if (json.hasOwnProperty(key)) { alert(json[key].id); alert(json[key].msg); } } 

E dà un risultato perfetto.

Guarda il violino qui: http://jsfiddle.net/zrSmp/

Da quando ho già iniziato a esaminarlo:

 var data = [{ "id": "1", "msg": "hi", "tid": "2013-05-05 23:35", "fromWho": "[email protected]" }, { "id": "2", "msg": "there", "tid": "2013-05-05 23:45", "fromWho": "[email protected]" }] 

E questa funzione

 var iterateData =function(data){ for (var key in data) { if (data.hasOwnProperty(key)) { console.log(data[key].id); } }}; 

Puoi chiamarlo così

 iterateData(data); // write 1 and 2 to the console 

Aggiornamento dopo il commento Erics

Come eric ha sottolineato un ciclo for for in per un array può avere risultati inaspettati . La domanda di riferimento ha una lunga discussione su pro e contro.

Prova con per (var i …

Ma sembra che il follwing sia piuttosto salvo:

 for(var i = 0; i < array.length; i += 1) 

Sebbene un test in cromo avesse il seguente risultato

 var ar = []; ar[0] = "a"; ar[1] = "b"; ar[4] = "c"; function forInArray(ar){ for(var i = 0; i < ar.length; i += 1) console.log(ar[i]); } // calling the function // returns a,b, undefined, undefined, c, undefined forInArray(ar); 

Prova con .forEach()

Almeno in chrome 30 funziona come previsto

 var logAr = function(element, index, array) { console.log("a[" + index + "] = " + element); } ar.forEach(logAr); // returns a[0] = a, a[1] = b, a[4] = c 

link

  • guarda for in al MDN
  • il nuovo metodo forEach
  • un commento che afferma che la comprensione dell'array rende meno male
  • Comprensione dell'array introdotta con javascript 1.7 in firefox 2 (si 2)

Deve essere un array se vuoi scorrere su di esso. Probabilmente manchi [ e ] .

 var x = [{ "id": "1", "msg": "hi", "tid": "2013-05-05 23:35", "fromWho": "[email protected]" }, { "id": "2", "msg": "there", "tid": "2013-05-05 23:45", "fromWho": "[email protected]" }]; var $output = $('#output'); for(var i = 0; i < x.length; i++) { console.log(x[i].id); } 

Dai un'occhiata a questo jsfiddle: http://jsfiddle.net/lpiepiora/kN7yZ/

Un po ‘tardi ma spero di poter aiutare gli altri: D

il tuo json deve sembrare qualcosa che Niklas ha già detto. E poi ecco qua:

 for(var key in currentObject){ if(currentObject.hasOwnProperty(key)) { console.info(key + ': ' + currentObject[key]); } } 

se hai una matrice multidimensionale, questo è il tuo codice:

 for (var i = 0; i < multiDimensionalArray.length; i++) { var currentObject = multiDimensionalArray[i] for(var key in currentObject){ if(currentObject.hasOwnProperty(key)) { console.info(key + ': ' + currentObject[key]); } } } 
 var arr = [ { "id": "1", "msg": "hi", "tid": "2013-05-05 23:35", "fromWho": "[email protected]" }, { "id": "2", "msg": "there", "tid": "2013-05-05 23:45", "fromWho": "[email protected]" } ]; 

per ogni metodo per una facile implementazione.

 arr.forEach(function(item){ console.log('ID: ' + item.id); console.log('MSG: ' + item.msg); console.log('TID: ' + item.tid); console.log('FROMWHO: ' + item.fromWho); }); 

Sta funzionando. Ho appena aggiunto parentesi quadre ai dati JSON. I dati sono:

 var data = [{ "id": "1", "msg": "hi", "tid": "2013-05-05 23:35", "fromWho": "[email protected]" }, { "id": "2", "msg": "there", "tid": "2013-05-05 23:45", "fromWho": "[email protected]" }] 

E il ciclo è:

 for (var ke in data) { if (data.hasOwnProperty(ke)) { alert(data[ke].id); } } 

Bene, tutto quello che posso vedere è che hai due oggetti JSON, separati da una virgola. Se entrambi fossero all’interno di un array ( [...] ) avrebbe più senso.

E, se SONO all’interno di un array, si utilizzerebbe semplicemente il tipo di loop standard “per var i = 0 …”. Così com’è, penso che proverà a recuperare la proprietà “id” della stringa “1”, quindi “id” di “ciao” e così via.

Una soluzione breve che utilizza la map e una funzione di freccia

 var data = [{ "id": "1", "msg": "hi", "tid": "2013-05-05 23:35", "fromWho": "[email protected]" }, { "id": "2", "msg": "there", "tid": "2013-05-05 23:45", "fromWho": "[email protected]" }]; data.map((item, i) => console.log('Index:', i, 'Id:', item.id));