Comment obtenir toutes les valeurs de propriétés d'un Objet Javascript (sans connaître les clés)?
Si il y a un objet Javascript:
var objects={...};
Suppose qu'il y a plus de 50 propriétés, sans connaître les noms de propriété (c'est sans savoir les 'clés') comment faire pour obtenir chaque valeur de propriété dans une boucle?
- Note aux lecteurs: pour ne pas manquer le très perspicace réponse
- Double Possible de Comment afficher la liste des propriétés d'un objet JavaScript
Vous devez vous connecter pour publier un commentaire.
À l'aide d'un simple
for..in
boucle:enumerable
indicateur a la valeur false. Cela - entre autres choses - signifie que vous n'aurez pas à effectuer une itération sur les méthodes de classe, mais vous permettra d'effectuer une itération sur les méthodes créées par d'autres moyens.Selon les navigateurs qui ont à soutenir, ce qui peut être fait dans un certain nombre de façons. L'écrasante majorité des navigateurs, dans la nature du soutien ECMAScript 5 (ES5), mais sachez que la plupart des exemples ci-dessous utilisent
Object.keys
, ce qui n'est pas disponible dans IE < 9. Voir la tableau de compatibilité.ECMAScript 3+
Si vous avez à prendre en charge les anciennes versions d'IE, c'est l'option pour vous:
Imbriquée
if
permet de s'assurer que vous n'avez pas d'énumérer plus de propriétés dans la chaîne de prototype de l'objet (qui est le comportement que vous voudrez certainement). Vous devez utiliserplutôt que
parce que ECMAScript 5+ vous permet de créer prototypeless objets avec
Object.create(null)
, et que ces objets n'auront pas lehasOwnProperty
méthode. Coquine code peut également produire des objets qui remplacent leshasOwnProperty
méthode.ECMAScript 5+
Vous pouvez utiliser ces méthodes dans n'importe quel navigateur qui prend en charge ECMAScript 5 et au-dessus. Ces valeurs d'un objet et d'éviter l'énumération sur la chaîne de prototype. Où
obj
est votre objet:Si vous voulez quelque chose d'un peu plus compact ou vous voulez être prudent avec les fonctions de boucles, puis
Array.prototype.forEach
est votre ami:La méthode suivante crée un tableau contenant les valeurs d'un objet. C'est pratique pour faire des boucles plus.
Si vous voulez faire de ceux qui utilisent
Object.keys
sûre contrenull
(commefor-in
est), alors vous pouvez faireObject.keys(obj || {})...
.Object.keys
retourne énumérable propriétés. Pour itérer sur des objets simples, ce qui est généralement suffisant. Si vous avez quelque chose de non-énumérable propriétés que vous avez besoin pour travailler avec, vous pouvez utiliserObject.getOwnPropertyNames
en place deObject.keys
.ECMAScript 2015+ (A. K. A. ES6)
Tableaux sont plus faciles à itérer avec ECMAScript 2015. Vous pouvez l'utiliser à votre avantage lorsque l'on travaille avec des valeurs une par une dans une boucle:
À l'aide de ECMAScript 2015 gras-flèche fonctions, la cartographie de l'objet à un tableau de valeurs devient un one-liner:
ECMAScript 2015 introduit
Symbol
, dont les instances peuvent être utilisés comme noms de propriété. Pour obtenir les symboles d'un objet d'énumérer plus, l'utilisationObject.getOwnPropertySymbols
(cette fonction est pourquoiSymbol
ne peut pas être utilisé pour faire des propriétés privées). La nouvelleReflect
API de ECMAScript 2015 fournitReflect.ownKeys
, qui renvoie une liste des noms de propriété (y compris les non-énumérable) et des symboles.Tableau des compréhensions (ne pas tenter d'utiliser)
Tableau interprétations ont été retiré de ECMAScript 6 avant la publication. Avant leur enlèvement, une solution aurait ressemblé:
ECMAScript 2017+
ECMAScript 2016 ajoute des fonctionnalités qui ne touchent pas à ce sujet. L'ECMAScript 2017 spécification ajoute
Object.values
etObject.entries
. Elles renvoient toutes les deux tableaux (ce qui peut être surprenant pour certains, compte tenu de l'analogie avecArray.entries
).Object.values
peut être utilisé tel quel ou avec unfor-of
boucle.Si vous souhaitez utiliser à la fois la clé et la valeur, puis
Object.entries
est fait pour vous. Elle produit un tableau rempli avec[key, value]
paires. Vous pouvez l'utiliser comme est, ou (note également l'ECMAScript 2015 déstructuration du travail) dans unfor-of
boucle:Object.values
caleEnfin, comme indiqué dans les commentaires et par teh_senaus dans une autre réponse, il peut être intéressant d'utiliser l'un de ces comme une cale. Ne vous inquiétez pas, la suite ne change pas le prototype, il ajoute juste une méthode pour
Object
(ce qui est beaucoup moins dangereux). À l'aide de graisse flèche fonctions, ce qui peut être fait en une ligne de trop:lesquelles vous pouvez maintenant utiliser comme
Si vous voulez éviter de calage lorsqu'un natif
Object.values
existe, alors vous pouvez faire:Enfin...
Être conscient des navigateurs/versions vous avez besoin de soutien. Le ci-dessus sont correctes lorsque les méthodes ou des fonctionnalités de langage sont mis en œuvre. Pour exemple, le soutien à ECMAScript 2015 a été éteint par défaut en V8 jusqu'à récemment, qui a propulsé les navigateurs tels que Chrome. Caractéristiques de ECMAScript 2015 devrait être évitée jusqu'à ce que les navigateurs que vous avez l'intention à l'appui de mettre en œuvre les fonctionnalités dont vous avez besoin. Si vous utilisez babel pour compiler votre code ECMAScript 5, vous avez accès à toutes les fonctionnalités de cette réponse.
obj
deux fois. Je suppose que la création d'une fonction d'assistance est inévitable? Quelque chose comme valeurs(obj).Object.values = obj => Object.keys(obj).map(key => obj[key]);
if (!Object.values)
avant de remplacer éventuellement le moteur plus efficace la mise en œuvre?Object.keys(..).map(..)
approche de la liquidation de l'itération sur un objet deux fois? Une fois de convertir les clés d'un tableau, puis de nouveau pendant la.map
? Il semble que les performances de gens à l'esprit serait en fait préférer lesfor key in obj | if (hasOwnProperty)
approche de itère une seule fois..keys(..).map(..)
techniqueObject.keys
et s'il doit effectuer une itération sur tous propriétés de l'objet (qui, si elle n'est pas mieux qu'unfor
boucle). Si ça ne marche pas, alors oui, je pense que vous êtes complètement à droite - les frais généraux de la collecte et ensuite itérer sur un dans un deuxième temps est probablement encore moins de la boucle à un moment unique sur l'ensemble de la chaîne de prototype.Voici une réutilisables fonction pour obtenir les valeurs dans un tableau. Il prend des prototypes en compte.
Object
n'est pas beaucoup d'un problème (Object.keys
est une commune de la cale), vous pensez probablement de modifier l'Objet prototype.hasOwnProperty()
? Comment serait la clé d'itération dans la boucle de cet objet n'a pas la propriété?Si vous avez accès à Underscore.js, vous pouvez utiliser le
_.les valeurs de
fonction comme ceci:Si vous voulez vraiment un tableau de Valeurs, je trouve cela plus propre que la construction d'un tableau avec une pour ... en boucle.
ECMA 5.1+
Il est intéressant de noter que dans la plupart des cas, vous n'avez pas vraiment besoin d'un tableau de valeurs, il sera plus rapide pour ce faire:
Ce itère sur les touches de l'Objet o. Dans chaque itération k est définie sur une touche. o.
ES5
de l'Objet.les touches
Vous pouvez faire une boucle à travers les touches:
sera de sortie:
Pour ceux début de l'adaptation de gens sur le CofeeScript ère, voici un autre équivalent.
Qui peut être mieux que cela, car les
objects
peut être réduite à être tapé à nouveau et une diminution de la lisibilité.utiliser un polyfill comme:
ensuite utiliser
3) bénéfice!
Apparemment - que j'ai appris récemment - c'est le moyen le plus rapide de le faire:
ECMA2017 à partir de:
Object.values(obj)
va vous chercher toutes les valeurs de propriété comme un tableau.https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_objects/Object/values
Utilisation:
Object.values()
, nous passons à un objet comme argument et de recevoir un tableau de valeurs en tant que valeur de retour.Ce retourne un tableau d'un objet donné propres énumération des valeurs de propriété. Vous obtiendrez les mêmes valeurs que par l'aide de la
for in
boucle, mais sans les propriétés sur le Prototype. Cet exemple sera probablement rendre les choses plus claires:JS:
Voici une fonction similaire à PHP array_values()
Voici comment faire pour obtenir l'objet de valeurs si vous utilisez ES6 ou plus:
Compatible avec ES7 même certains navigateurs ne supportent pas encore
Depuis ,
Object.values(<object>)
sera intégré dans ES7 &En attente jusqu'à ce que tous les navigateurs pour le soutenir , vous pouvez l'enrouler à l'intérieur d'une fonction :
Alors :
Une fois que les navigateurs soient compatibles avec ES7, vous n'aurez pas à changer quoi que ce soit dans votre code.
Je me rends compte que je suis un peu en retard mais voici un cale pour le nouveau firefox 47
Object.values
méthodeObjet.les entrées de le faire dans une meilleure façon.
JS:
dans ECMAScript5 utilisation
Sinon, si vous êtes navigateur ne le supporte pas, utiliser le
for..in loop
object[key]
pour obtenir les valeurs dans une boucle.for..in
(et hasOwnProperty) donc il n'a pas vraiment de gain de rien .. je souhaite que ECMAScript 5e définiObject.pairs
(etObject.items
pour[[key, value], ..]
), mais hélas, il ne le fait pas.Maintenant, j'utilise Dojo Toolkit parce que les anciens navigateurs ne prennent pas en charge
Object.values
.De sortie :
utilisation
et si vous utilisez google chrome, ouvrez la Console en utilisant les touches Ctrl+Maj+j
Goto >> Console