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": "[email protected]"
}, {
  "id": "2",
  "msg": "there",
  "tid": "2013-05-05 23:45",
  "fromWho": "[email protected]"
}

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?

Alosyius
quelle
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
3
Mögliches Duplikat der Schleife durch ein Array in JavaScript
Heretic Monkey
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": "[email protected]"
},
{
    "id" : "2", 
    "msg"   : "there",
    "tid" : "2013-05-05 23:45",
    "fromWho": "[email protected]"
}];

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); });
Niklas
quelle
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": "[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.

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

Der dunkle Ritter
quelle
16
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]"
  }
];

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);
});
Sivanesh S.
quelle
16

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);
});
chirag sorathiya
quelle
10

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

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

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

Surfmuggle
quelle
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": "[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);
   }
} 
Shyam Shinde
quelle
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": "[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 diese jsfiddle an: http://jsfiddle.net/lpiepiora/kN7yZ/

lpiepiora
quelle
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]);
            }
       }
}
Kami Yang
quelle
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.

Katana314
quelle
2

Eine kurze Lösung mit mapund eine 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 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": "[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));

user2314737
quelle
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": "[email protected]"
}, {
  "id": "2",
  "msg": "there",
  "tid": "2013-05-05 23:45",
  "fromWho": "[email protected]"
}]}

Ihr Java-Skript ist einfach

var objCount = json.item.length;
for ( var x=0; x < objCount ; xx++ ) {
    var curitem = json.item[x];
}
Robb Penoyer
quelle