web-dev-qa-db-de.com

JavaScript-Schleife durch Json-Array?

Ich versuche, das folgende Json-Array zu durchlaufen:

{
  "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]"
}

Und habe folgendes ausprobiert

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

Aber aus irgendeinem Grund bekomme ich nur den ersten Teil, id 1 Werte.

Irgendwelche Ideen?

99
Alosyius

Ihre JSON sollte so aussehen:

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]"
}];

Sie können das Array wie folgt durchlaufen:

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

    console.log(obj.id);
}

Oder wie folgt (von Eric vorgeschlagen): Seien Sie vorsichtig mit IE Support

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

Es gibt ein paar Probleme in Ihrem Code, zuerst muss Ihr Json so aussehen:

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]"
}];

Als Nächstes können Sie wie folgt iterieren:

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

Und es gibt ein perfektes Ergebnis.

Siehe die Geige hier: http://jsfiddle.net/zrSmp/

21
The Dark Knight

Da habe ich schon angefangen, nachzuschauen:

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

Und diese Funktion 

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

Man kann es so nennen

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

Update nach Erics-Kommentar

Als eric wies darauf eine for in-Schleife für ein Array kann unerwartete Ergebnisse haben . Die Frage, auf die verwiesen wird, hat eine lange Diskussion über Vor- und Nachteile. 

Testen Sie mit für (var i ...

Es scheint jedoch, dass das Folgende ziemlich sicher ist:

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

Ein Test in Chrom hatte zwar folgendes Ergebnis

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); 

Testen Sie mit .forEach()

Zumindest in Chrom 30 funktioniert dies wie erwartet

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

Links

8
surfmuggle
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]"
  }
];

forEach Methode zur einfachen Implementierung.

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

Es muss ein Array sein, wenn Sie darüber iterieren möchten. Sehr wahrscheinlich fehlen [ und ].

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

Schauen Sie sich dieses jsfiddle an: http://jsfiddle.net/lpiepiora/kN7yZ/

6
lpiepiora

Ein bisschen spät, aber ich hoffe, ich kann anderen helfen: D

dein Json muss so aussehen, als hätte Niklas es schon gesagt. Und dann geht es los:

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

wenn Sie ein mehrdimensionales Array haben, ist dies Ihr Code: 

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]);
            }
       }
}
5
Kami Yang

Es funktioniert. Ich habe gerade eckige Klammern zu JSON-Daten hinzugefügt. Die Daten sind:

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

Und die Schleife ist:

for (var key in data) {
   if (data.hasOwnProperty(key)) {
         alert(data[key].id);
   }
} 
4
Shyam Shinde

Alles, was ich dort sehen kann, ist, dass Sie zwei JSON-Objekte haben, die durch ein Komma getrennt sind. Wenn sich beide innerhalb eines Arrays ([...]) befinden, ist das sinnvoller.

Wenn sie sich innerhalb eines Arrays befinden, würden Sie einfach den Standardschleifen-Typ "for var i = 0 ..." verwenden. Ich denke, es wird versuchen, die "id" -Eigenschaft der Zeichenfolge "1" und dann die "id" von "hi" abzurufen.

2
Katana314

Eine kurze Lösung mit map und einer Pfeilfunktion

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));

Und für die Fälle, in denen die Eigenschaft "id" nicht vorhanden ist, verwenden Sie filter :

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]"
}, {
  "msg": "abcde",
  "tid": "2013-06-06 23:46",
  "fromWho": "[email protected]"
}];

data.filter(item=>item.hasOwnProperty('id'))
                .map((item, i) => console.log('Index:', i, 'Id:', item.id));

2
user2314737

versuche dies 

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]"
}];

json.forEach((item) => {
  console.log('ID: ' + item.id);
  console.log('MSG: ' + item.msg);
  console.log('TID: ' + item.tid);
  console.log('FROMWHO: ' + item.fromWho);
});
0