101 votes

Javascript comptant le nombre d'objets dans l'objet

J'ai un objet du genre :

Object {0=Object, 1=Object, 2=Object} // Output from console.log(obj.Data);

Mais il n'y a aucun moyen de compter le nombre d'objets dans l'objet, puis de récupérer la valeur de l'attribut dans les sous-objets.

J'ai essayé

console.log(obj.Data[0].length); // It does not work

console.log(obj.Data.length); // It does not work

C'est un peu délicat pour moi. J'espère que vous pourrez m'aider.

133voto

Michael Geary Points 10391

La façon la plus simple de le faire, avec d'excellentes performances et une compatibilité avec les anciens et les nouveaux navigateurs, est d'inclure l'un ou l'autre des éléments suivants Lo-Dash o Underscore dans votre page.

Ensuite, vous pouvez utiliser soit _.size(object) o _.keys(object).length

Pour votre obj.Data vous pouvez le tester avec :

console.log( _.size(obj.Data) );

ou :

console.log( _.keys(obj.Data).length );

Lo-Dash et Underscore sont deux excellentes bibliothèques ; vous trouverez l'une ou l'autre très utile dans votre code. (Elles sont assez similaires l'une à l'autre ; Lo-Dash est une version plus récente avec quelques avantages).

Alternativement, vous pouvez inclure cette fonction dans votre code, qui boucle simplement sur les propriétés de l'objet et les compte :

function ObjectLength( object ) {
    var length = 0;
    for( var key in object ) {
        if( object.hasOwnProperty(key) ) {
            ++length;
        }
    }
    return length;
};

Vous pouvez le tester avec :

console.log( ObjectLength(obj.Data) );

Ce code n'est cependant pas aussi rapide qu'il pourrait l'être dans les navigateurs modernes. Pour une version qui est beaucoup plus rapide dans les navigateurs modernes et qui fonctionne toujours dans les anciens, vous pouvez utiliser :

function ObjectLength_Modern( object ) {
    return Object.keys(object).length;
}

function ObjectLength_Legacy( object ) {
    var length = 0;
    for( var key in object ) {
        if( object.hasOwnProperty(key) ) {
            ++length;
        }
    }
    return length;
}

var ObjectLength =
    Object.keys ? ObjectLength_Modern : ObjectLength_Legacy;

et comme précédemment, testez-le avec :

console.log( ObjectLength(obj.Data) );

Ce code utilise Object.keys(object).length dans les navigateurs modernes et revient à compter en boucle pour les anciens navigateurs.

Mais si vous vous lancez dans tout ce travail, je vous recommande d'utiliser plutôt Lo-Dash ou Underscore et de bénéficier de tous les avantages offerts par ces bibliothèques.

J'ai mis en place un jsPerf qui compare la vitesse de ces différentes approches . Veuillez l'exécuter dans tous les navigateurs que vous avez à portée de main pour ajouter aux tests.

Merci à Barmar para suggérant Object.keys pour les navigateurs plus récents dans sa réponse.

103voto

Barmar Points 135986

Dans les navigateurs récents, vous pouvez utiliser :

Object.keys(obj.Data).length

Voir MDN

Pour les navigateurs plus anciens, utilisez l'option for-in boucle dans la réponse de Michael Geary.

38voto

Mota Chuha Points 1063

Essayez Démonstration ici

var list ={}; var count= Object.keys(list).length;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X