wake-up-neo.com

Javascript: array.length gibt undefined zurück

Ich habe eine Reihe von Daten, die von der json_encode-Funktion von PHP weitergegeben werden. Ich verwende die jQuery-Funktion getJSON, um sie zu decodieren: 

$.getJSON("url", function (data) {
    console.log(data);
});

Die Ausgabe sieht in der Konsole folgendermaßen aus:

Object {1: Object, 2: Object, 3: Object, 4: Object, 5: Object, 6: Object, 7: Object, 8: Object, 9: Object, 10: Object}

Ich kann auf jedes Array mit data[1], data[2] etc zugreifen, aber um es einfacher zu machen, dachte ich an das Schleifen, dachte daran, damit ich auf alle auf einmal zugreifen kann:

$.getJSON("url", function (data) {
    for (var i = 0, len = data.length; i < len; i++) {
        //do something
    }
});

Ich kann dies jedoch nicht zum Laufen bringen, da der data.length den Wert undefined zurückgibt. Was ist falsch und wie kann ich es beheben?

40
rksh

Objekte haben keine .length-Eigenschaft.

Eine einfache Lösung, wenn Sie wissen, dass Sie sich nicht um hasOwnProperty-Überprüfungen kümmern müssen, ist Folgendes:

Object.keys(data).length;

Wenn Sie haben zur Unterstützung von IE 8 oder niedriger, müssen Sie stattdessen eine Schleife verwenden:

var length= 0;
for(var key in data) {
    if(data.hasOwnProperty(key)){
        length++;
    }
}
64
Cerbrus

Eine Möglichkeit ist:

Object.keys(myObject).length

Leider funktioniert es nicht unter älteren IE Versionen (unter 9).

Wenn Sie diese Kompatibilität benötigen, verwenden Sie die schmerzhafte Version:

var key, count = 0;
for(key in myObject) {
  if(myObject.hasOwnProperty(key)) {
    count++;
  }
}
16
ragatskynet

Es sieht so aus, als wäre es kein Array, sondern ein beliebiges Objekt. Wenn Sie die Serialisierung von PHP steuern können, können Sie dies möglicherweise ändern.

Wie raina77owdarauf hinweist , könnte man dies in PHP tun, indem man etwas wie folgt ersetzt:

json_encode($something) 

mit so etwas wie:

json_encode(array_values($something))

Aber ignorieren Sie nicht die anderen Antworten zu Object.keys. Sie sollten auch das erreichen, was Sie möchten, wenn Sie nicht die Möglichkeit oder den Wunsch haben, die Serialisierung Ihres Objekts zu ändern.

5
Scott Sauyet

versuche dies

Object.keys(data).length

Wenn IE <9, können Sie das Objekt selbst mit einer for-Schleife durchlaufen

var len = 0;
var i;

for (i in data) {
    if (data.hasOwnProperty(i)) {
        len++;
    }
}
2

Eine einfache Lösung für diese Frage ist das Hinzufügen von "[" am Anfang Ihrer Json-Datei und das Beenden mit "]". Das hat es für mich gelöst.