Comment puis-je parcourir tous les membres d'un objet JavaScript, y compris les valeurs qui sont des objets.
Par exemple, comment pourrais-je parcourir cela (en accédant à "votre_nom" et "votre_message" pour chacun)?
var validation_messages = {
"key_1": {
"your_name": "jimmy",
"your_msg": "hello world"
},
"key_2": {
"your_name": "billy",
"your_msg": "foo equals bar"
}
}
javascript
EDT
la source
la source
Réponses:
la source
for in
est très similaire à un traditionnelforeach
.Sous ECMAScript 5, vous pouvez combiner
Object.keys()
etArray.prototype.forEach()
:la source
for ... in ... hasOwnProperty
modèle peut être appelé sur n'importe quoi, pour autant que je sache (objet, tableau, null, non défini, vrai, faux, primitif numérique, objets).Object.keys()
ce qui le ralentit, c'est plutôt leforEach()
et l'accès répété à.length
! Si vous utilisez unfor
-loop classique à la place, c'est presque deux fois plus rapide quefor..in
+hasOwnProperty()
dans Firefox 33.Le problème avec ça
c'est que vous allez également parcourir le prototype de l'objet primitif.
Avec celui-ci vous l'éviterez:
la source
hasOwnProperty
dans vosfor
-in
boucles.Dans ES6 / 2015, vous pouvez parcourir un objet comme celui-ci: (en utilisant fonction flèche )
jsbin
Dans ES7 / 2016, vous pouvez utiliser
Object.entries
au lieu deObject.keys
et parcourir un objet comme celui-ci:Ce qui précède fonctionnerait également comme une ligne :
jsbin
Si vous souhaitez également parcourir les objets imbriqués, vous pouvez utiliser une fonction récursive (ES6):
jsbin
Identique à la fonction ci-dessus, mais avec ES7
Object.entries()
au lieu deObject.keys()
:Ici, nous parcourons les objets imbriqués pour modifier les valeurs et renvoyer un nouvel objet en une seule fois en
Object.entries()
combinaison avecObject.fromEntries()
( ES10 / 2019 ):la source
Utilisation de Underscore.js
_.each
:la source
Si vous utilisez la récursivité, vous pouvez renvoyer des propriétés d'objet de n'importe quelle profondeur.
la source
I. les clés doivent être accessibles,
✔ l' approche
of
etObject.keys
✔ l'
in
approcheUtilisez celui-ci avec prudence, car il pourrait imprimer les propriétés du prototype de
obj
✔ l'approche ES7
Cependant, au moment de l'édition, je ne recommanderais pas la méthode ES7, car JavaScript initialise beaucoup de variables en interne pour construire cette procédure (voir les retours pour preuve). À moins que vous ne développiez pas une énorme application qui mérite une optimisation, alors c'est ok mais si l'optimisation est votre priorité, vous devriez y penser.
II. nous avons juste besoin d'accéder à chaque valeur,
✔ l' approche
of
etObject.values
Plus de retours sur les tests:
Object.keys
ou lesObject.values
performances sont négligeablesPar exemple,
Par
Object.values
exemple, l'utilisation d'unefor
boucle native avec des variables mises en cache dans Firefox semble être un peu plus rapide que l'utilisation d'unefor...of
boucle. Toutefois , la différence est pas si important et Chrome tournefor...of
plus vite que natiffor
boucle, donc je recommande d'utiliserfor...of
lorsqu'ils traitent avecObject.values
dans tous les cas (4e et 6e essais).Dans Firefox, la
for...in
boucle est vraiment lente, donc quand on veut mettre la clé en cache pendant l'itération il vaut mieux l'utiliserObject.keys
. De plus, Chrome exécute les deux structures à vitesse égale (1er et dernier tests).la source
Je sais qu'il est tard, mais il m'a fallu 2 minutes pour écrire cette version optimisée et améliorée de la réponse d'AgileJon:
la source
hasOwnProperty
dansowns
, puis en appelant auowns.call(obj, prop)
lieu de simplement appelerobj.hasOwnProperty(prop)
que cette réponse fait?obj
que lahasOwnProperty
fonction peut être définie sur elle-même, elle n'utilisera donc pas celle deObject.prototype
. Vous pouvez essayer avant lafor
boucle comme ceciobj.hasOwnProperty = function(){return false;}
et il n'itérera sur aucune propriété.la source
p est la valeur
OU
la source
Dans ES7, vous pouvez faire:
la source
la source
Peu de façons de le faire ...
1) 2 couches pour ... en boucle ...
2) Utilisation
Object.key
3) Fonction récursive
Et appelez-le comme:
la source
Voici la version améliorée et récursive de la solution d'AgileJon ( démo ):
Cette solution fonctionne pour toutes sortes de profondeurs différentes.
la source
Une autre option:
la source
ECMAScript-2017, qui vient d'être finalisé il y a un mois, présente Object.values (). Alors maintenant, vous pouvez le faire:
la source
Je pense qu'il vaut la peine de souligner que jQuery trie bien avec
$.each()
.Voir: https://api.jquery.com/each/
Par exemple:
$(this)
étant l'élément unique à l'intérieur de l'objet. Basculez$('.foo')
vers une variable si vous ne souhaitez pas utiliser le moteur de sélection de jQuery.la source
Pour parcourir un objet JavaScript, nous pouvons utiliser forEach et pour optimiser le code, nous pouvons utiliser la fonction flèche
la source
Je n'ai pas pu obtenir les messages ci-dessus pour faire exactement ce que je cherchais.
Après avoir joué avec les autres réponses ici, je l'ai fait. C'est hacky, mais ça marche!
Pour cet objet:
... ce code:
... produit ceci dans la console:
la source
La solution qui fonctionne pour moi est la suivante
la source
Exotique - traversée profonde
Dans cette solution, nous utilisons un remplaçant qui permet de parcourir en profondeur l'objet entier et les objets imbriqués - à chaque niveau, vous obtiendrez tous les champs et toutes les valeurs. Si vous devez obtenir le chemin d' accès complet à chaque champ, regardez ici
Afficher l'extrait de code
la source
Dans mon cas (sur la base de ce qui précède) est possible un certain nombre de niveaux.
résultat:
la source