Comment compter efficacement le nombre de clés/propriétés d'un objet en JavaScript ?

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

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

(Firefox fournissait une propriété magique __count__, mais elle a été supprimée quelque part vers la version 4).

Si vous rencontrez réellement un problème de performance, je suggérerais d'envelopper les appels qui ajoutent/suppriment des propriétés à/de l'objet avec une fonction qui incrémente/décrémente également une propriété nommée de manière appropriée (taille ?).

Vous n'avez besoin de calculer le nombre initial de propriétés qu'une seule fois et de continuer à partir de là. S&#8217il n&#8217y a pas de réel problème de performance, ne vous donnez pas la peine. Enveloppez simplement ce bout de code dans une fonction getNumberOfProperties(object) et finissez-en.

Commentaires (6)

Je ne connais pas de moyen de le faire, mais pour limiter les itérations au minimum, vous pourriez essayer de vérifier l'existence de __count__ et s'il n'existe pas (c'est-à-dire pas Firefox), vous pourriez alors itérer sur l'objet et le définir pour une utilisation ultérieure, par exemple :

if (myobj.__count__ === undefined) {
  myobj.__count__ = ...
}

De cette façon, tout navigateur supportant __count__ l'utiliserait, et les itérations ne seraient effectuées que pour ceux qui ne le font pas. Si le compte change et que vous ne pouvez pas procéder ainsi, vous pouvez toujours en faire une fonction :

if (myobj.__count__ === undefined) {
  myobj.__count__ = function() { return ... }
  myobj.__count__.toString = function() { return this(); }
}

De cette façon, chaque fois que vous faites référence à myobj.__count__, la fonction se déclenche et recalcule.

Commentaires (4)

Je ne pense pas que cela soit possible (du moins pas sans utiliser certains éléments internes). Et je ne pense pas que vous gagneriez beaucoup en optimisant cela.

Commentaires (1)