S'il y a un objet Javascript:
var objects={...};
Supposons qu'il possède plus de 50 propriétés, sans connaître les noms de propriété (c'est-à-dire sans connaître les «clés»), comment obtenir chaque valeur de propriété dans une boucle?
S'il y a un objet Javascript:
var objects={...};
Supposons qu'il possède plus de 50 propriétés, sans connaître les noms de propriété (c'est-à-dire sans connaître les «clés»), comment obtenir chaque valeur de propriété dans une boucle?
Réponses:
En utilisant une
for..in
boucle simple :la source
enumerable
indicateur est défini sur false. Cela - entre autres - signifie que vous n'itérerez pas sur les méthodes de classe, mais que vous itérerez sur les méthodes créées d'autres manières.Selon les navigateurs que vous devez prendre en charge, cela peut se faire de plusieurs manières. La grande majorité des navigateurs dans la nature prennent en charge ECMAScript 5 (ES5), mais sachez que la plupart des exemples ci-dessous utilisent
Object.keys
, qui n'est pas disponible dans IE <9. Voir le tableau de compatibilité .ECMAScript 3+
Si vous devez prendre en charge les anciennes versions d'IE, alors c'est l'option pour vous:
L'imbriqué
if
s'assure que vous n'énumérez pas les propriétés dans la chaîne prototype de l'objet (ce qui est le comportement que vous voulez presque certainement). Tu dois utiliserplutôt que
car ECMAScript 5+ vous permet de créer des objets sans prototype avec
Object.create(null)
, et ces objets n'auront pas lahasOwnProperty
méthode. Le code vilain peut également produire des objets qui remplacent lahasOwnProperty
méthode.ECMAScript 5+
Vous pouvez utiliser ces méthodes dans n'importe quel navigateur prenant en charge ECMAScript 5 et supérieur. Ceux-ci obtiennent des valeurs d'un objet et évitent d'énumérer sur la chaîne de prototype. Où
obj
est votre objet:Si vous voulez quelque chose d'un peu plus compact ou si vous voulez faire attention aux fonctions en boucle, alors
Array.prototype.forEach
votre ami est:La méthode suivante construit un tableau contenant les valeurs d'un objet. C'est pratique pour boucler.
Si vous voulez faire ceux qui utilisent
Object.keys
contre la sécuriténull
(commefor-in
est), alors vous pouvez le faireObject.keys(obj || {})...
.Object.keys
renvoie des propriétés énumérables . Pour itérer sur des objets simples, cela suffit généralement. Si vous avez quelque chose avec des propriétés non énumérables avec lesquelles vous devez travailler, vous pouvez utiliserObject.getOwnPropertyNames
à la place deObject.keys
.ECMAScript 2015+ (AKA ES6)
Les tableaux sont plus faciles à itérer avec ECMAScript 2015. Vous pouvez l'utiliser à votre avantage lorsque vous travaillez avec des valeurs une par une dans une boucle:
À l'aide des fonctions de flèche grasse d'ECMAScript 2015, le mappage de l'objet à un tableau de valeurs devient une ligne unique:
ECMAScript 2015 introduit
Symbol
, dont les instances peuvent être utilisées comme noms de propriété. Pour obtenir l'énumération des symboles d'un objet, utilisezObject.getOwnPropertySymbols
(cette fonction est pourquoiSymbol
ne peut pas être utilisée pour créer des propriétés privées). La nouvelleReflect
API d'ECMAScript 2015 fournitReflect.ownKeys
, qui renvoie une liste de noms de propriétés (y compris les noms non énumérables) et de symboles.Compréhensions de tableau (n'essayez pas d'utiliser)
Les compréhensions des tableaux ont été supprimées d'ECMAScript 6 avant la publication. Avant leur suppression, une solution aurait ressemblé à:
ECMAScript 2017+
ECMAScript 2016 ajoute des fonctionnalités qui n'ont pas d'impact sur ce sujet. La spécification ECMAScript 2017 ajoute
Object.values
etObject.entries
. Les deux tableaux de retour (ce qui sera surprenant pour certains étant donné l'analogie avecArray.entries
).Object.values
peut être utilisé tel quel ou avec unefor-of
boucle.Si vous souhaitez utiliser à la fois la clé et la valeur, alors
Object.entries
c'est pour vous. Il produit un tableau rempli de[key, value]
paires. Vous pouvez l'utiliser tel quel ou (notez également l'affectation de déstructuration ECMAScript 2015) dans unefor-of
boucle:Object.values
caleEnfin, comme indiqué dans les commentaires et par teh_senaus dans une autre réponse, il peut être utile d'utiliser l'un d'entre eux comme une cale. Ne vous inquiétez pas, ce qui suit ne change pas le prototype, il ajoute simplement une méthode à
Object
(ce qui est beaucoup moins dangereux). En utilisant les fonctions de flèche grasse, cela peut également être fait sur une seule ligne:que vous pouvez maintenant utiliser comme
Si vous voulez éviter le calage lorsqu'un natif
Object.values
existe, vous pouvez faire:Finalement...
Soyez conscient des navigateurs / versions que vous devez prendre en charge. Les éléments ci-dessus sont corrects lorsque les méthodes ou les fonctionnalités du langage sont implémentées. Par exemple, la prise en charge d'ECMAScript 2015 a été désactivée par défaut dans V8 jusqu'à récemment, ce qui alimentait des navigateurs tels que Chrome. Les fonctionnalités d'ECMAScript 2015 doivent être évitées jusqu'à ce que les navigateurs que vous envisagez de prendre en charge implémentent les fonctionnalités dont vous avez besoin. Si vous utilisez babel pour compiler votre code vers ECMAScript 5, vous avez alors accès à toutes les fonctionnalités de cette réponse.
la source
obj
deux fois. Je suppose que la création d'une fonction d'aide est inévitable? Quelque chose comme des valeurs (obj).Object.values = obj => Object.keys(obj).map(key => obj[key]);
Voici une fonction réutilisable pour obtenir les valeurs dans un tableau. Il prend également en compte les prototypes.
la source
Object
n'est pas vraiment un problème (Object.keys
c'est une cale courante), vous songez probablement à modifier le prototype Object.hasOwnProperty()
? Comment la clé serait-elle itérée dans la boucle de cet objet qui n'a pas la propriété?Si vous avez accès à Underscore.js, vous pouvez utiliser la
_.values
fonction comme ceci:la source
Si vous voulez vraiment un tableau de valeurs, je trouve cela plus propre que de construire un tableau avec une boucle for ... in.
ECMA 5.1+
Il convient de noter que dans la plupart des cas, vous n'avez pas vraiment besoin d'un tableau de valeurs, il sera plus rapide de le faire:
Cela itère sur les clés de l'objet o. Dans chaque itération, k est défini sur une clé de o.
la source
ES5
Object.keys
la source
Vous pouvez parcourir les clés:
affichera:
la source
Pour les premiers à s'adapter à l'ère CofeeScript, voici un autre équivalent.
Ce qui peut être mieux que cela, car le
objects
peut être réduit pour être tapé à nouveau et la lisibilité diminuée.la source
utiliser un polyfill comme:
puis utilisez
3) profit!
la source
À partir de l'ECMA2017:
Object.values(obj)
vous récupérera toutes les valeurs de propriété sous forme de tableau.https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_objects/Object/values
la source
Apparemment - comme je l'ai récemment appris - c'est le moyen le plus rapide de le faire:
la source
La question ne précise pas si vous souhaitez également des propriétés héritées et non énumérables.
Il y a une question pour obtenir tout, les propriétés héritées et les propriétés non énumérables , que Google ne peut pas facilement trouver.
Ma solution pour cela est:
Et puis parcourez-les, utilisez simplement une boucle for-of:
Afficher l'extrait de code
la source
Utilisez:,
Object.values()
nous passons un objet comme argument et recevons un tableau de valeurs comme valeur de retour.Cela retourne un tableau d'un objet donné propres valeurs de propriété énumérables. Vous obtiendrez les mêmes valeurs qu'en utilisant la
for in
boucle mais sans les propriétés sur le prototype. Cet exemple clarifiera probablement les choses:la source
la source
Voici une fonction similaire à PHP array_values ()
Voici comment obtenir les valeurs de l'objet si vous utilisez ES6 ou supérieur:
la source
Compatible avec ES7, même certains navigateurs ne le prennent pas encore en charge
Depuis,
Object.values(<object>)
sera intégré dans ES7 &Jusqu'à ce que tous les navigateurs l'attendent, vous pouvez l'envelopper dans une fonction:
Alors :
Une fois que les navigateurs seront compatibles avec ES7, vous n'aurez plus rien à changer dans votre code.
la source
Je me rends compte que je suis un peu en retard mais voici une cale pour la nouvelle
Object.values
méthode firefox 47la source
Les entrées d'objet le font mieux.
la source
const myObj = { a:1, b:2, c:3 }
Obtenez toutes les valeurs:
le chemin le plus court:
const myValues = Object.values(myObj)
const myValues = Object.keys(myObj).map(key => myObj[key])
la source
la source
dans l' utilisation d' ECMAScript5
Sinon, si votre navigateur ne le prend pas en charge, utilisez le
for..in loop
la source
object[key]
pour obtenir les valeurs dans une boucle.for..in
(et hasOwnProperty) donc ça ne gagne vraiment rien. Je souhaite que ECMAScript 5ème soit définiObject.pairs
(etObject.items
pour[[key, value], ..]
), mais hélas, ce n'est pas le cas.J'utilise maintenant Dojo Toolkit car les anciens navigateurs ne le prennent pas en charge
Object.values
.Production :
la source
utilisation
et si vous utilisez google chrome open Console en utilisant Ctrl + Maj + j
Aller >> Console
la source