1778 votes

La façon la plus efficace de compter le nombre de touches/propriétés d'un objet en JavaScript?

Quel est le moyen le plus rapide pour compter le nombre de touches/propriétés d'un objet? Est-il possible de le faire sans une itération sur l'objet? c'est à dire sans faire

var count = 0;
for (k in myobj) if (myobj.hasOwnProperty(k)) count++;

(Firefox a fourni une magie __count__ de la propriété, mais cela a été supprimé quelque part autour de la version 4.)

2865voto

Avi Flax Points 14898

Pour ce faire, dans toute ES5-compatible à l'environnement, tels que le Nœud, Chrome, IE 9+, FF 4+, Safari 5+:

Object.keys(obj).length

159voto

Renaat De Muynck Points 1230

Vous pouvez utiliser ce code:

if (!Object.keys) {
    Object.keys = function (obj) {
        var keys = [],
            k;
        for (k in obj) {
            if (Object.prototype.hasOwnProperty.call(obj, k)) {
                keys.push(k);
            }
        }
        return keys;
    };
}

ensuite, vous pouvez le faire dans les navigateurs plus anciens ainsi:

var len = Object.keys(obj).length;

141voto

studgeek Points 4617

Si vous utilisez Underscore.js vous pouvez utiliser _.taille (merci @maison):
_.size(obj)

Sinon, vous pouvez également utiliser _.les clés de ce qui peut être plus clair pour certains:
_.keys(obj).length

Je recommande fortement le trait de Soulignement, son serrée de la bibliothèque pour faire beaucoup de choses de base. Chaque fois que possible, s'ils correspondent ECMA5 et de reporter à l'implémentation native.

Sinon je soutiens @Avi réponse. J'ai édité pour ajouter un lien vers les MDC doc qui comprend la méthode keys() vous pouvez ajouter à la non-ECMA5 navigateurs.

92voto

Luc125 Points 3144

La norme de l'Objet de la mise en œuvre ( ES5.1 Objet Interne Propriétés et Méthodes ) ne nécessite pas un Objet à suivre son nombre de touches/propriétés, il devrait donc y avoir aucun moyen standard pour déterminer la taille d'un Objet, sans explicitement ou implicitement une itération sur ses touches.

Donc, ici, sont les plus couramment utilisés alternatives:

1. ECMAScript de l'Objet.les touches()

Object.keys(obj).length; Fonctionne en interne une itération sur les touches pour calculer un tableau temporaire et retourne sa longueur.

  • Pros Lisible et une syntaxe propre. Pas de bibliothèque ou d'un code personnalisé, sauf une cale si la prise en charge native n'est pas disponible
  • Le contre - Mémoire de frais généraux en raison de la création de la matrice.

2. Bibliothèque de solutions à base d'

De nombreux bibliothèque basée sur des exemples ailleurs dans cette rubrique sont utiles idiomes dans le contexte de leur bibliothèque. À partir d'un point de vue des performances, cependant, il n'y a rien à gagner par rapport à un idéal de non-bibliothèque de code, puisque tous ceux de la bibliothèque de méthodes d'encapsuler une boucle for ou ES5 Object.keys (natif ou calée).

3. L'optimisation d'une boucle for

La plus lente d'une telle boucle for est généralement l' .hasOwnProperty() d'appels, en raison de l'appel de la fonction de surcharge. Donc quand je veux juste le nombre d'entrées d'un objet JSON, je viens de sauter le .hasOwnProperty() appel si je sais qu'aucun code n'a ni la volonté d'étendre Object.prototype.

Sinon, votre code pourrait être très légèrement optimisé en réduisant k locale (var k) et en utilisant le préfixe-opérateur de décrémentation (++count) au lieu de postfix.

var count = 0;
for (var k in myobj) if (myobj.hasOwnProperty(k)) ++count;

Une autre idée s'appuie sur la mise en cache de l' hasOwnProperty méthode:

var hasOwn = Object.prototype.hasOwnProperty;
var count = 0;
for (var k in myobj) if (hasOwn.call(myobj, k)) ++count;

Si c'est plus rapide ou pas sur un environnement donné est une question de benchmarking. Très limitée gain de performance peut être prévu de toute façon.

34voto

Confusion Points 6056

Si vous sont effectivement en cours d'exécution dans un problème de performance, je voudrais suggérer d'emballage les appels que ajouter/supprimer des propriétés à/à partir de l'objet avec une fonction aussi incrémente/décrémente un bien nommé (taille?) de la propriété.

Vous avez seulement besoin de calculer le nombre initial de propriétés une fois et de passer à partir de là. Si il n'y a pas un réel problème de performance, n'est pas la peine. Juste envelopper ce bout de code dans une fonction, getNumberOfProperties(object) et être fait avec elle.

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