JavaScript-Schleife durch JSON-Array?


151

Ich versuche, das folgende JSON-Array zu durchlaufen:

{
  "id": "1",
  "msg": "hi",
  "tid": "2013-05-05 23:35",
  "fromWho": "hello1@email.se"
}, {
  "id": "2",
  "msg": "there",
  "tid": "2013-05-05 23:45",
  "fromWho": "hello2@email.se"
}

Und habe folgendes versucht

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?


Fehlen Klammern? Es sieht jetzt nicht wirklich wie ein Array aus. Und haben Sie den JSON analysiert?
Denys Séguret

ist es eine Reihe von Objekten? (Vermissen Sie [] oder sind sie nicht da?)
lpiepiora

9
Es ist weder JSON noch Array.
JJJ


Bitte ändern Sie den Titel, dies dient zum Durchlaufen der Eigenschaften eines JSON-Objekts und nicht eines Arrays
Taylored Web Sites

Antworten:


222

Ihr JSON sollte folgendermaßen aussehen:

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

Sie können das Array folgendermaßen durchlaufen:

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

    console.log(obj.id);
}

Oder so (vorgeschlagen von Eric), sei vorsichtig mit der IE-Unterstützung

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

11
Oder genauer gesagtjson.forEach(function(obj) { console.log(obj.id); });
Eric

4
Es sei denn auf IE8 (wie üblich, alle außer IE;))
lpiepiora

3
Ich denke, dieses Beispiel kann verwirrend sein, da var json kein JSON-Objekt, sondern ein Array ist. In diesem Fall funktioniert .forEach gut, aber wenn Sie ein JSON-Objekt verwenden, funktioniert es nicht.
Mpoletto

27

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": "hello1@email.se"
},
{
"id" : "2", 
"msg"   : "there",
"tid" : "2013-05-05 23:45",
"fromWho": "hello2@email.se"
}];

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.

Sehen Sie die Geige hier: http://jsfiddle.net/zrSmp/


16
var arr = [
  {
  "id": "1",
  "msg": "hi",
  "tid": "2013-05-05 23:35",
  "fromWho": "hello1@email.se"
  }, {
  "id": "2",
  "msg": "there",
  "tid": "2013-05-05 23:45",
  "fromWho": "hello2@email.se"
  }
];

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

16

Versuche dies

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

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

10

Da habe ich schon angefangen mich damit zu beschäftigen:

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

Und diese Funktion

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

Sie können es so nennen

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

Update nach Erics Kommentar

Wie Eric betonte, kann eine for inSchleife für ein Array unerwartete Ergebnisse haben . Die referenzierte Frage hat eine lange Diskussion über Vor- und Nachteile.

Test mit für (var i ...

Aber es scheint, dass das Folgende ziemlich sicher ist:

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

Obwohl ein Test in Chrom das folgende Ergebnis hatte

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

Test 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


2
-1 - for ... in Schleifen sollten nicht für Arrays verwendet werden
Eric

Array-Verständnis verwenden for each. for ... in ...ist ein Sprachkonstrukt zum Auflisten von Objektschlüsseln in beliebiger Reihenfolge. Das ist nicht das richtige Konstrukt für ein Array.
Eric

9

Es funktioniert. Ich habe gerade JSON-Daten in eckige Klammern gesetzt. Die Daten sind:

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

Und die Schleife ist:

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

6

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

var x = [{
    "id": "1",
        "msg": "hi",
        "tid": "2013-05-05 23:35",
        "fromWho": "hello1@email.se"
}, {
    "id": "2",
        "msg": "there",
        "tid": "2013-05-05 23:45",
        "fromWho": "hello2@email.se"
}];

var $output = $('#output');
for(var i = 0; i < x.length; i++) {
    console.log(x[i].id);
}

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


5

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

Ihr JSON muss wie etwas aussehen, das Niklas bereits gesagt hat. 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]);
            }
       }
}

3

Nun, alles was ich dort sehen kann ist, dass Sie zwei JSON-Objekte haben, die durch ein Komma getrennt sind. Wenn sich beide in einem Array ( [...]) befinden würden, wäre dies sinnvoller.

Und wenn sie sich innerhalb eines Arrays befinden, verwenden Sie einfach den Standardschleifentyp "for var i = 0 ...". Ich denke, es wird versucht, die "id" -Eigenschaft der Zeichenfolge "1", dann "id" von "hi" usw. abzurufen.


2

Eine kurze Lösung mit mapund eine Pfeilfunktion

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

Und um die Fälle abzudecken, in denen die Immobilie "id"nicht vorhanden ist, verwenden Sie filter:

var data = [{
  "id": "1",
  "msg": "hi",
  "tid": "2013-05-05 23:35",
  "fromWho": "hello1@email.se"
}, {
  "id": "2",
  "msg": "there",
  "tid": "2013-05-05 23:45",
  "fromWho": "hello2@email.se"
}, {
  "msg": "abcde",
  "tid": "2013-06-06 23:46",
  "fromWho": "hello3@email.se"
}];

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


0

oh mein ... warum macht das jeder so schwer !!?

Ihr Daten-Snippet muss ein wenig erweitert werden, und es muss so sein, um richtig json zu sein. Beachten Sie, dass ich nur das Array-Namensattribut "item" einbinde.

{"item":[
{
  "id": "1",
  "msg": "hi",
  "tid": "2013-05-05 23:35",
  "fromWho": "hello1@email.se"
}, {
  "id": "2",
  "msg": "there",
  "tid": "2013-05-05 23:45",
  "fromWho": "hello2@email.se"
}]}

Ihr Java-Skript ist einfach

var objCount = json.item.length;
for ( var x=0; x < objCount ; xx++ ) {
    var curitem = json.item[x];
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.