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?
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++;
}
}
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++;
}
}
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.
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++;
}
}
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.