L'implémentation d'objet standard ( propriétés et méthodes internes de l'objet ES5.1 ) ne nécessite pas Object
de suivi de son nombre de clés / propriétés, il ne devrait donc pas y avoir de méthode standard pour déterminer la taille d'unObject
sans itération explicite ou implicite sur ses clés.
Voici donc les alternatives les plus utilisées:
1. Object.keys d'ECMAScript ()
Object.keys(obj).length;
Fonctionne en itérant en interne sur les clés pour calculer un tableau temporaire et renvoie sa longueur.
- Avantages - Syntaxe lisible et propre. Aucune bibliothèque ou code personnalisé requis sauf un shim si le support natif n'est pas disponible
- Inconvénients - surcharge de mémoire due à la création de la baie.
2. Solutions basées sur la bibliothèque
De nombreux exemples basés sur des bibliothèques ailleurs dans cette rubrique sont des idiomes utiles dans le contexte de leur bibliothèque. Du point de vue des performances, cependant, il n'y a rien à gagner par rapport à un code parfait sans bibliothèque, car toutes ces méthodes de bibliothèque encapsulent en fait une boucle for ou ES5Object.keys
For (native ou shimmed).
3. Optimiser une boucle for
La partie la plus lente d'une telle boucle for est généralement l' .hasOwnProperty()
appel, en raison de la surcharge d'appel de la fonction. Donc, quand je veux juste le nombre d'entrées d'un objet JSON, je saute juste l' .hasOwnProperty()
appel si je sais qu'aucun code n'a fait ni ne s'étendra Object.prototype
.
Sinon, votre code pourrait être très légèrement optimisé en rendant k
local ( var k
) et en utilisant l'opérateur prefix-increment ( ++count
) au lieu de postfix.
var count = 0;
for (var k in myobj) if (myobj.hasOwnProperty(k)) ++count;
Une autre idée repose sur la mise en cache de la hasOwnProperty
méthode:
var hasOwn = Object.prototype.hasOwnProperty;
var count = 0;
for (var k in myobj) if (hasOwn.call(myobj, k)) ++count;
Que ce soit plus rapide ou non dans un environnement donné est une question de benchmarking. Un gain de performances très limité peut être attendu de toute façon.