var obj = {
name: "Simon",
age: "20",
clothing: {
style: "simple",
hipster: false
}
}
for(var propt in obj){
console.log(propt + ': ' + obj[propt]);
}
Comment la variable propt
représente-t-elle les propriétés de l'objet? Ce n'est pas une méthode ou une propriété intégrée. Pourquoi propose-t-il toutes les propriétés de l'objet?
javascript
loops
object
Rafay
la source
la source
if (typeof(obj[propt]) === 'object') {
/ * Recommencez * /}
Réponses:
L'itération des propriétés nécessite cette
hasOwnProperty
vérification supplémentaire :C'est nécessaire car le prototype d'un objet contient des propriétés supplémentaires pour l'objet qui font techniquement partie de l'objet. Ces propriétés supplémentaires sont héritées de la classe d'objets de base, mais sont toujours des propriétés de
obj
.hasOwnProperty
vérifie simplement s'il s'agit d'une propriété spécifique à cette classe, et non héritée de la classe de base.Il est également possible d'appeler
hasOwnProperty
via l'objet lui-même:Mais cela échouera si l'objet a un champ sans rapport avec le même nom:
C'est pourquoi il est plus sûr de l'appeler à la
Object.prototype
place:la source
object.hasOwnProperty()
? Le fait d'property
avoir une valeur quelconque n'implique- t-il pas que c'est le casobject
?property
est une chaîne ici, aurait dû être appeléepropertyName
. Sinon, cela peut causer de la confusion aux débutants JS comme moi, c'est-à-dire quoi faire à l'intérieur duif
.Depuis JavaScript 1.8.5, vous pouvez utiliser
Object.keys(obj)
pour obtenir un tableau de propriétés définies sur l'objet lui-même (celles qui renvoient true pourobj.hasOwnProperty(key)
).C'est mieux (et plus lisible) que d'utiliser une boucle for-in.
Il est pris en charge sur ces navigateurs:
Voir la référence de Mozilla Developer Network Object.keys () pour plus d'informations.
la source
Object.keys(myObject).forEach(function(key,index) { //key = the name of the object key //index = the ordinal position of the key within the object });
for candidate in candidateStatus
... me semble lisibleLes filles et les gars, nous sommes en 2019 et nous n'avons pas beaucoup de temps pour taper ... Alors, faisons cette nouvelle ECMAScript 2016:
la source
obj=window.performance.memory
: - / Où commefor in
ça. ievar obj = window.performance.memory; for( key in obj ) console.log( 'key=' + key + ' val=' + obj[key] );
window.performance.memory
n'est pris en charge que par chrome etObject.keys(obj)
renvoie un tableau vide. Cela n'a rien à voir avec.map
.e
, j'ai publié cet essentiel. C'est fondamentalement comme la plupart des implémentations de hachage, et utilise à la(
(key)
=>
(value)
)
place de{
key
=>
value
}
, mais si vous n'avez pas eu à y faire face auparavant, cela pourrait vous aider à mieux le visualiser: gist.github.com/the-nose-knows/9f06e745a56ff20519707433e28a4fa8C'est le
for...in statement
( MDN , spécification ECMAScript ).Vous pouvez le lire comme " POUR chaque propriété DANS l'
obj
objet, affectez tour à tour chaque propriété à la variable PROPT ".la source
in
opérateur et lafor
déclaration ne sont pas impliqués du tout, lafor-in
déclaration représente une production de grammaire sur son propre:for ( LeftHandSideExpression in Expression )
,for ( var VariableDeclarationNoIn in Expression )
Dans les implémentations mises à jour d'ES, vous pouvez utiliser
Object.entries
:ou
Si vous souhaitez simplement parcourir les valeurs, utilisez Object.values:
ou
la source
C'est juste une
for...in
boucle. Consultez la documentation sur Mozilla .la source
Si votre environnement prend en charge ES2017, je recommanderais Object.entries :
Comme indiqué dans la documentation Mozillas Object.entries () :
Fondamentalement, avec Object.entries, nous pouvons renoncer à l'étape supplémentaire suivante qui est requise avec l'ancienne pour ... en boucle:
la source
jquery vous permet de le faire maintenant:
la source
$.each({foo:1, length:0, bar:2}, function(k,v){console.log(k,v)})
$ .each n'est pas adapté aux objets. Si un objet possède une propriété length et que sa valeur est nulle, l'objet entier est traité comme s'il s'agissait d'un tableau vide.La réponse de Dominik est parfaite, je préfère simplement le faire de cette façon, car c'est plus propre à lire:
la source
Object
en majuscule o, non?Les réponses ci-dessus sont un peu ennuyeuses car elles n'expliquent pas ce que vous faites à l'intérieur de la boucle for après vous être assuré qu'il s'agit d'un objet: VOUS N'Y ACCÉDEZ PAS DIRECTEMENT! En réalité, vous ne recevez que la CLÉ que vous devez appliquer à l’OBJ:
Tout cela est sûr ECMA5. Fonctionne même dans les versions JS boiteuses comme Rhino;)
la source
Pour ajouter l'utilisation de ES2015 de
Reflect.ownKeys(obj)
et l'itération d'ES2015 sur les propriétés via un itérateur.Par exemple:
peut être répété par
Si vous souhaitez parcourir directement les valeurs des clés d'un objet, vous pouvez définir un
iterator
, tout comme les itérateurs par défaut de JavaScipts pour les chaînes, les tableaux, les tableaux typés, Map et Set.JS tentera d'itérer via la propriété d'itérateur par défaut, qui doit être définie comme
Symbol.iterator
.Si vous voulez pouvoir parcourir tous les objets, vous pouvez l'ajouter en tant que prototype d'objet:
Cela vous permettrait d'itérer sur les valeurs d'un objet avec une boucle for ... of, par exemple:
Attention : Au moment d'écrire cette réponse (juin 2018), tous les autres navigateurs, mais IE, prennent en charge les générateurs et l'
for...of
itération viaSymbol.iterator
la source
la source
forEach
saute les valeurs vides , je pense que vous pouvez vous débarrasser du si et faireObject.keys(obj).forEach(e => console.log(`key=${e} value=${obj[e]}`));
comme la réponse de Frank Roth.La boucle for ... in représente chaque propriété d'un objet, car elle ressemble à une boucle for. Vous avez défini propt dans la boucle for ... in en faisant:
Une boucle for ... in parcourt les propriétés énumérables d'un objet. Quelle que soit la variable que vous définissez ou placez dans la boucle for ... in, elle change chaque fois qu'elle passe à la propriété suivante qu'elle itère. La variable dans la boucle for ... in parcourt les clés, mais sa valeur est la valeur de la clé. Par exemple:
Vous pouvez voir en quoi la variable diffère de sa valeur. En revanche, une boucle for ... of fait le contraire.
J'espère que ça aide.
la source
la source
forEach
est plus approprié ici, car ilmap
est destiné à renvoyer un nouveau tableau avec les résultats de l'appel du bloc de code à chaque itération. Mais nous ne nous intéressons qu'aux effets secondaires de chaque itération, pas à la valeur de retour, nous n'avons donc pas besoin de ce nouveau tableau quimap
nous donne.la source
Vous pouvez utiliser Lodash. La documentation
la source
Votre
for
boucle itère sur toutes les propriétés de l'objetobj
.propt
est défini dans la première ligne de votre boucle for. Il s'agit d'une chaîne qui est le nom d'une propriété de l'obj
objet. Dans la première itération de la boucle,propt
serait "nom".la source
Les objets en JavaScript sont des collections de propriétés et peuvent donc être bouclés dans un pour chaque instruction.
Vous devez penser
obj
à une collection de valeurs clés.la source
De nos jours, vous pouvez convertir un objet JS standard en un objet itérable simplement en ajoutant une méthode Symbol.iterator. Ensuite, vous pouvez utiliser une
for of
boucle et accéder directement à ses valeurs ou même utiliser un opérateur d'étalement sur l'objet également. Cool. Voyons comment on peut y arriver:la source
function*
découverte!Si vous exécutez Node, je recommanderais:
la source
Bien que la réponse la mieux notée soit correcte, voici un cas d'utilisation alternatif, c'est-à-dire si vous parcourez un objet et souhaitez créer un tableau à la fin. Utiliser
.map
au lieu deforEach
la source
Ajout également de la manière récursive:
Usage:
la source
Ce que fait la boucle for..in, c'est qu'elle crée une nouvelle variable (var someVariable) et stocke ensuite chaque propriété de l'objet donné dans cette nouvelle variable (someVariable) une par une. Par conséquent, si vous utilisez le bloc {}, vous pouvez itérer. Prenons l'exemple suivant.
la source
obj[someVariable]
. Peut-être que la raison pour laquelle il a été tant voté est qu'il n'est pas récursif. Ce ne serait donc pas une solution adéquate si vous avez un objet hautement structuré.Ici, j'itère chaque nœud et crée des noms de nœuds significatifs. Si vous remarquez, instanceOf Array et instanceOf Object font à peu près la même chose (dans mon application, je donne cependant une logique différente)
note - Je suis inspiré par la réponse d'Ondrej Svejdar. Mais cette solution a de meilleures performances et moins ambiguës
la source
Vous voulez essentiellement parcourir chaque propriété de l'objet.
JSFiddle
la source
obj(prop)
<- TypeError: obj n'est pas une fonctionhasOwnProperty
attribut. Ça devrait marcher maintenant.Je veux ajouter aux réponses ci-dessus, car vous pourriez avoir des intentions différentes de Javascript. Un objet JSON et un objet Javascript sont des choses différentes, et vous voudrez peut-être parcourir les propriétés d'un objet JSON en utilisant les solutions proposées ci-dessus, puis être surpris.
Supposons que vous ayez un objet JSON comme:
La mauvaise façon d'itérer à travers ses «propriétés»:
Vous pourriez être surpris de voir l'enregistrement de la console
0
,1
etc. lorsque vous parcourez à travers les propriétésprop1
etprop2
etprop3_1
. Ces objets sont des séquences et les index d'une séquence sont les propriétés de cet objet en Javascript.Une meilleure façon d'itérer récursivement les propriétés d'un objet JSON serait de vérifier d'abord si cet objet est une séquence ou non:
la source
Pour affiner davantage la réponse acceptée, il convient de noter que si vous instanciez l'objet avec un
var object = Object.create(null)
alorsobject.hasOwnProperty(property)
déclenchera une TypeError. Donc, pour être sûr, vous devez l'appeler à partir du prototype comme ceci:la source
Vérifiez ce lien, il vous aidera à https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_state_forin
la source