web-dev-qa-db-fra.com

Javascript: array.length renvoie undefined

J'ai un ensemble de données qui est transmis par la fonction json_encode de PHP. J'utilise la fonction jQuery getJSON pour le décoder: 

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

La sortie ressemble à ceci dans la console:

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

Je peux accéder à chaque tableau en utilisant data[1], data[2] etc.

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

Cependant, je ne peux pas obtenir que cela fonctionne car le data.length renvoie la valeur undefined. Quel est le problème et comment puis-je le réparer?

40
rksh

Les objets n'ont pas de propriété .length.

Une solution simple, si vous savez que vous n'avez pas à vous soucier des vérifications hasOwnProperty, serait la suivante:

Object.keys(data).length;

Si vous devez pour prendre en charge IE 8 ou une version inférieure, vous devrez utiliser une boucle:

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

Une option est:

Object.keys(myObject).length

Malheureusement, cela ne fonctionne pas avec les anciennes versions IE (moins de 9 ans).

Si vous avez besoin de cette compatibilité, utilisez la version douloureuse:

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

Il semble que ce ne soit pas un tableau, mais un objet arbitraire. Si vous avez le contrôle sur la sérialisation PHP, vous pourrez peut-être changer cela.

Comme raina77owa souligné , une façon de procéder dans PHP consiste à remplacer le texte suivant:

json_encode($something) 

avec quelque chose comme:

json_encode(array_values($something))

Mais n'ignorez pas les autres réponses ici à propos de Object.keys. Ils doivent également accomplir ce que vous voulez si vous n'avez pas la capacité ou le désir de changer la sérialisation de votre objet.

5
Scott Sauyet

essaye ça

Object.keys(data).length

Si IE <9, vous pouvez parcourir vous-même l'objet avec une boucle for

var len = 0;
var i;

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

Une solution simple à cette question consiste à ajouter '[' au début de votre fichier json et à le terminer par un ']'. Cela a résolu le problème pour moi.