11
votes

Déterminez combien de champs un objet JavaScript a

J'ai un objet javascript que j'essaie d'utiliser comme "hashmap". Les clés sont toujours des cordes, donc je ne pense pas avoir besoin de quoi que ce soit aussi sophistiqué que ce qui est décrit dans Cette question donc question . (Je ne m'attends pas non plus au nombre de clés d'aller au-dessus d'environ 10, donc je ne suis pas particulièrement préoccupé par les recherches O (n) vs. O (journal n), etc.)

La seule fonctionnalité que je veux que construite -in Les objets JavaScript ne semblent pas avoir, est un moyen rapide de comprendre le nombre de paires de clé / valeur dans l'objet, comme ce que Java's Carte.Size retourne. Bien sûr, vous pouvez simplement faire quelque chose comme: xxx

mais cela semble un type de hacky et de rond-point. Y a-t-il une "bonne façon" d'obtenir le nombre de champs dans l'objet?


1 commentaires

La seule suggestion à votre méthode serait d'ajouter un paramètre supplémentaire à exclure / inclure les propriétés héritées, dans ce cas, vous utiliseriez HASOWNPROPERTY au lieu de la simple boucle


4 Réponses :


0
votes

Vous pouvez aussi simplement faire myObject.length (dans les tableaux)

Nevermind, voyez ceci: Taille d'objet JavaScript


3 commentaires

Il ne demande pas de tableaux, ni pour un taille de . Il veut le nombre de mappages (paires de clés) dans un objet.


myObject.length a été ma première pensée, mais oui, cela ne fonctionne que pour les tableaux.


BTW, le lien que vous donnez est pour la taille de, par ex. Nombre d'octets utilisés. OP veut connaître le nombre de paires de la valeur clé dans un objet. (J'ai presque fait -1 parce que ce n'est pas une réponse à la question; Cependant, le lien est intéressant, même si sur un sujet différent.)



0
votes

C'est tout ce que vous pouvez faire. Clairement, les objets JavaScript ne sont pas conçus pour cela. Et cela ne vous donnera que le nombre de propriétés énumérables. Essayez getObjectsize (math) .


0 commentaires

3
votes

Correction: Vous devez vérifier myObject.hasownProperty (clé) code> dans chaque itération, car il peut être hérité des attributs hérités. Par exemple, si vous faites cela avant la boucle objet.pototype.test = 'test' code>, test code> aslo doit être compté.

et parler de votre question: vous pouvez Définissez simplement une fonction d'assistance, si la vitesse n'a pas d'importance. Après tout, nous définissons des aides pour la fonction de garniture et d'autres choses simples. Beaucoup de JavaScript est "type de hacky et de rond-point" :) p>

mise à jour strong>

Exemple de défaillance, comme demandé. P>

Object.prototype.test = 'test';
var x = {};
x['a'] = 1;
x['b'] = 2;


4 commentaires

L'objet est créé avec myObject = {} et ensuite les propriétés sont ajoutées à celle-ci avec myObject [clé] = valeur clé est toujours une chaîne . Je pense donc que ce ne serait pas une préoccupation dans ce cas.


@MatrixFrog oh, vraiment? :) Peu importe le type de type "clé". J'ai ajouté un exemple pour clarifier le point.


BTW, Anurag appuie le même point de sa réponse (le commentaire de là)


Je ne suis pas d'accord avec l'utilisation de HasownProperty, utilisez uniquement cela si vous ne voulez que les accessoires sur l'objet lui-même. Dans mon cas, cependant, je veux généralement compter également les propriétés héritées. De plus, si vous utilisez un objet en tant que carte, il n'y a pas de propriétés immatures héritées. Sauf si vous utilisez une bibliothèque naïve qui modifie le "prototype" de l'objet, auquel cas tu devrais savoir mieux et y avoir déjà rencontré.



14
votes

Il existe un moyen plus facile de spécification dans ECMAScript 5.

objet.keys (..) code> renvoie une matrice de toutes les touches définies sur l'objet. La longueur peut être appelée à ce sujet. Essayez en Chrome: P>

var map = new HashMap();
map.put(someKey, someValue);
map.size();


4 commentaires

Les clés ne renvoient que les touches d'énorme et haussières.


"TypeError: objet.keys n'est pas une fonction". Je suppose que j'aurais dû mentionner que je travaille sur une extension de Firefox, donc si cela ne fonctionne pas dans Firefox, alors c'est à peu près inutile pour moi. Néanmoins, de bonnes informations pour l'avenir. Merci!


@Matthew - Oui, c'est pourquoi j'ai dit défini sur l'objet et oui énumérabilité est important aussi, mais c'est ce que pour..in reviendra aussi, alors je l'ai laissé hors de la discussion. @MatrixFrog - Il devrait arriver à Firefox 4, et vous pouvez toujours définir un type d'objet personnalisé avec une méthode de taille, comme dans l'exemple ci-dessus.


@Matthew, pour obtenir toutes les propriétés, énumérables ou non, nous pouvons maintenant utiliser dans ES5 le objet.getownPropertyNames méthode.