web-dev-qa-db-fra.com

Javascript comptant le nombre d'objets dans l'objet

J'ai un objet qui ressemble à:

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

Mais il n’ya aucun moyen de compter le nombre d’objets dans l’objet, puis d’obtenir enfin la valeur de l’attribut des 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 difficile pour moi. J'espère que vous pouvez aider.

75
Bryan Learn

Le moyen le plus simple de procéder, avec d'excellentes performances et une compatibilité avec les anciens et les nouveaux navigateurs, consiste à inclure Lo-Dash ou nderscore dans votre page.

Ensuite, vous pouvez utiliser soit _.size(object) ou _.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 d'excellentes bibliothèques. vous en trouverez un très utile dans votre code. (Ils sont assez semblables les uns aux autres; Lo-Dash est une version plus récente avec quelques avantages.)

Vous pouvez également inclure cette fonction dans votre code, qui parcourt simplement 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 tester cela avec:

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

Ce code n'est toutefois pas aussi rapide que dans les navigateurs modernes. Pour une version beaucoup plus rapide dans les navigateurs modernes et qui fonctionne encore 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 avant, testez-le avec:

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

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

Mais si vous allez travailler tout ce travail, je vous recommanderais plutôt d'utiliser Lo-Dash ou Underscore pour obtenir tous les avantages offerts par ces bibliothèques.

J'ai mis en place un jsPerf qui compare la vitesse de ces différentes approches . S'il vous plaît lancez-le dans tous les navigateurs que vous avez pratique d'ajouter aux tests.

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

106
Michael Geary

Dans les navigateurs récents, vous pouvez utiliser:

Object.keys(obj.Data).length

Voir MDN

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

59
Barmar

Essayez Demo Here

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