J'ai un objet JavaScript, existe-t-il un moyen intégré ou accepté de meilleures pratiques pour obtenir la longueur de cet objet?
const myObject = new Object();
myObject["firstname"] = "Gareth";
myObject["lastname"] = "Simpson";
myObject["age"] = 21;
javascript
javascript-objects
Gareth Simpson
la source
la source
Object.keys(obj).length
Réponses:
La réponse la plus robuste (c'est-à-dire qui capture l'intention de ce que vous essayez de faire tout en causant le moins de bogues) serait:
Il y a une sorte de convention en JavaScript selon laquelle vous n'ajoutez rien à Object.prototype , car cela peut casser les énumérations dans diverses bibliothèques. Cependant, ajouter des méthodes à Object est généralement sûr.
Voici une mise à jour à partir de 2016 et un déploiement généralisé d'ES5 et au-delà. Pour IE9 + et tous les autres navigateurs modernes ES5 +, vous pouvez utiliser
Object.keys()
le code ci-dessus comme suit:Cela ne doit modifier aucun prototype existant car il
Object.keys()
est maintenant intégré.Edit : les objets peuvent avoir des propriétés symboliques qui ne peuvent pas être retournées via la méthode Object.key. La réponse serait donc incomplète sans les mentionner.
Le type de symbole a été ajouté au langage pour créer des identificateurs uniques pour les propriétés des objets. Le principal avantage du type Symbol est la prévention des écrasements.
Object.keys
ouObject.getOwnPropertyNames
ne fonctionne pas pour les propriétés symboliques. Pour les retourner, vous devez utiliserObject.getOwnPropertySymbols
.la source
Object.keys(obj).length
Si vous savez que vous n'avez pas à vous soucier des
hasOwnProperty
contrôles, vous pouvez le faire très simplement:la source
Mise à jour : si vous utilisez Underscore.js (recommandé, c'est léger!), Alors vous pouvez simplement faire
Sinon , et vous ne voulez pas jouer avec les propriétés d'objet pour une raison quelconque, et utilisez déjà jQuery, un plugin est également accessible:
la source
_.size()
était la solution parfaite pour mon projet Meteor , qui prend en charge underscore.js.Voici la solution la plus multi-navigateurs.
C'est mieux que la réponse acceptée car elle utilise des Object.keys natifs s'il existe. Ainsi, c'est le plus rapide pour tous les navigateurs modernes.
la source
Object.keys()
renvoie un tableau qui contient uniquement les noms des propriétés énumérables. Si vous voulez un tableau avec TOUTES les propriétés, vous devez utiliser à laObject.getOwnPropertyNames()
place. Voir developer.mozilla.org/en/docs/Web/JavaScript/Reference/…Je ne suis pas un expert JavaScript, mais il semble que vous deviez parcourir les éléments et les compter car Object n'a pas de méthode de longueur:
@palmsey: Pour être honnête avec l'OP, la documentation JavaScript se réfère en fait explicitement à l'utilisation de variables de type Object de cette manière en tant que "tableaux associatifs".
la source
Cette méthode obtient tous les noms de propriétés de votre objet dans un tableau, vous pouvez donc obtenir la longueur de ce tableau qui est égale à la longueur des clés de votre objet.
la source
Pour ne pas jouer avec le prototype ou un autre code, vous pouvez créer et étendre votre propre objet:
Si vous utilisez toujours la méthode add, la propriété length sera correcte. Si vous craignez que vous ou d'autres personnes l'utilisiez, vous pouvez également ajouter le compteur de propriétés que les autres ont publié dans la méthode de longueur.
Bien sûr, vous pouvez toujours remplacer les méthodes. Mais même si vous le faites, votre code échouera probablement sensiblement, ce qui facilitera le débogage. ;)
la source
Voici comment et n'oubliez pas de vérifier que la propriété n'est pas sur la chaîne prototype:
la source
Utilisez-le simplement pour obtenir
length
:la source
myArray
Voici une solution complètement différente qui ne fonctionnera que dans les navigateurs plus modernes (IE9 +, Chrome, Firefox 4+, Opera 11.60+, Safari 5.1+)
Voir jsFiddle
Configurez votre classe de tableau associatif
Vous pouvez maintenant utiliser ce code comme suit ...
la source
length
propriété, tout code qui l'utilise devra s'assurer qu'il n'essaye pas de se stockerlength
, mais je suppose que ce serait la même chose si c'était le cas. un tableau standard aussi. SurchargerhasOwnProperty
n'importe quel objet produirait très probablement un résultat indésirable.Cela fonctionne pour moi:
la source
Dans certains cas, il est préférable de simplement stocker la taille dans une variable distincte. Surtout, si vous ajoutez au tableau un élément en un seul endroit et pouvez facilement augmenter la taille. Cela fonctionnerait évidemment beaucoup plus rapidement si vous devez vérifier la taille souvent.
la source
Utilisation:
la source
Et pour être honnête avec @palmsey, il avait tout à fait raison, ce ne sont pas des tableaux associatifs, ce sont certainement des objets :) - faire le travail d'un tableau associatif. Mais en ce qui concerne le point plus large, vous semblez définitivement en avoir le droit selon cet article plutôt fin que j'ai trouvé:
Les «tableaux associatifs» JavaScript considérés comme nuisibles
Mais d'après tout cela, la réponse acceptée n'est-elle pas en soi une mauvaise pratique?
Si autre chose a été ajouté au Object .prototype, le code suggéré échouera:
Je ne pense pas que cette réponse devrait être acceptée car elle ne peut pas être approuvée pour fonctionner si vous avez un autre code en cours d'exécution dans le même contexte d'exécution. Pour le faire de manière robuste, vous devez sûrement définir la méthode de taille dans myArray et vérifier le type des membres à mesure que vous les parcourez.
la source
Si vous avez besoin d'une structure de données associative qui expose sa taille, mieux utiliser une carte au lieu d'un objet.
la source
Et quelque chose comme ça -
la source
Si nous avons le hachage
nous pouvons obtenir la longueur en utilisant la longueur des clés qui est la longueur du hachage:
la source
la source
var myObject = {}; for (let i=0; i<10000000; i++) myObject[i] = i;
Si vous utilisez AngularJS 1.x, vous pouvez faire les choses à la manière d'AngularJS en créant un filtre et en utilisant le code de l'un des autres exemples tels que les suivants:
Usage
Dans votre contrôleur:
Ou selon vous:
la source
La façon la plus simple est comme ça
où mon objet est l'objet de ce que vous voulez la longueur
la source
Si vous ne vous souciez pas de la prise en charge d'Internet Explorer 8 ou d'une version antérieure, vous pouvez facilement obtenir le nombre de propriétés d'un objet en appliquant les deux étapes suivantes:
Object.keys()
pour obtenir un tableau contenant uniquement les noms des propriétés énumérables ouObject.getOwnPropertyNames()
si vous souhaitez également inclure les noms des propriétés non énumérables..length
propriété de ce tableau.Si vous devez effectuer cette opération plusieurs fois, vous pouvez encapsuler cette logique dans une fonction:
Comment utiliser cette fonction particulière:
Voir aussi ce violon pour une démo.
la source
Utilisez
Object.keys(myObject).length
pour obtenir la longueur de l'objet / du tableaula source
la source
Une variation de certains des éléments ci-dessus est la suivante:
C'est une façon un peu plus élégante d'intégrer hasOwnProp.
la source
Voici une version différente de la réponse de James Cogan. Au lieu de passer un argument, il suffit de créer un prototype de la classe Object et de rendre le code plus propre.
exemple jsfiddle: http://jsfiddle.net/qar4j/1/
la source
Object.prototype
- mauvaise idée.Vous pouvez simplement l'utiliser
Object.keys(obj).length
sur n'importe quel objet pour obtenir sa longueur. Object.keys renvoie un tableau contenant toutes les clés d' objet (propriétés) qui peuvent être utiles pour trouver la longueur de cet objet en utilisant la longueur du tableau correspondant. Vous pouvez même écrire une fonction pour cela. Soyons créatifs et écrivons également une méthode pour cela (avec une propriété getter plus pratique):la source
Vous pouvez toujours faire
Object.getOwnPropertyNames(myObject).length
pour obtenir le même résultat que[].length
pour un tableau normal.la source
Object.keys()
renvoie un tableau qui contient uniquement les noms des propriétés énumérables. Si vous voulez un tableau avec TOUTES les propriétés, vous devez utiliser à laObject.getOwnPropertyNames()
place. Voir developer.mozilla.org/en/docs/Web/JavaScript/Reference/…Nous pouvons trouver la longueur de l'objet en utilisant:
la source
Un peu en retard dans le jeu, mais un bon moyen d'y parvenir (IE9 + uniquement) est de définir un getter magique sur la propriété length:
Et vous pouvez simplement l'utiliser comme ceci:
Donnerait
1
.la source
Vous trouverez ci-dessous une version de la réponse de James Coglan en CoffeeScript pour ceux qui ont abandonné le JavaScript direct :)
la source
size++ for own key of obj
(own key
étant le sucre de syntaxe dans CoffeeScript). L'utilisationhasOwnProperty
directe à partir de l'objet est dangereuse, car elle se brise lorsque l'objet possède réellement une telle propriété.