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.