Est-il possible de parcourir en boucle les propriétés d'un objet JavaScript? Par exemple, j'ai un objet JavaScript défini comme ceci:
myObject.options = {
property1: 'value 1',
property2: 'value 2'
};
Les propriétés seront ajoutées dynamiquement à cet objet. Y a-t-il un moyen pour moi de faire une boucle et de vérifier si une propriété existe? Si c'est le cas, comment?
Oui, vous pouvez et lodash n’est pas nécessaire… c’est-à-dire.
for (var key in myObject.options) {
// check also if property is not inherited from prototype
if (myObject.options.hasOwnProperty(key)) {
var value = myObject.options[key];
}
}
Edit : la réponse acceptée ( _. ForOwn () ) devrait être https://stackoverflow.com/a/21311045/528262
Utilisez _.forOwn()
.
_.forOwn(obj, function(value, key) { } );
https://lodash.com/docs#forOwn
Notez que forOwn
vérifie hasOwnProperty
, comme vous devez généralement le faire lorsque vous parcourez les propriétés d'un objet. forIn
ne fait pas cette vérification.
Pour votre volonté déclarée de "vérifier si une propriété existe", vous pouvez directement utiliser Lo-Dash (has
) .
var exists = _.has(myObject, propertyNameToCheck);
Prenons ci-dessous objet comme exemple
let obj = { property1: 'value 1', property2: 'value 2'};
Tout d'abord chercher toutes les clés dans l'objet
let keys = Object.keys(obj) //it will return array of keys
et ensuite en boucle
keys.forEach(key => //your way)
juste mettre tous ensemble
Object.keys(obj).forEach(key=>{/*code here*/})
Dans ES6, il est également possible de parcourir les valeurs d'un objet à l'aide de la boucle for..of
. Toutefois, cela ne fonctionne pas immédiatement pour les objets JavaScript, car vous devez définir une propriété @@ iterator sur l'objet. Cela fonctionne comme suit:
for..of
demande à l'objet "d'être itéré sur" (appelons-le obj1 pour un objet itérateur. La boucle itère sur obj1 en appelant successivement la méthode next () sur l'objet itérateur fourni et en utilisant la valeur renvoyée comme la valeur pour chaque itération de la boucle.Voici un exemple:
const obj1 = {
a: 5,
b: "hello",
[Symbol.iterator]: function() {
const thisObj = this;
let index = 0;
return {
next() {
let keys = Object.keys(thisObj);
return {
value: thisObj[keys[index++]],
done: (index > keys.length)
};
}
};
}
};
Nous pouvons maintenant utiliser la boucle for..of
:
for (val of obj1) {
console.log(val);
} // 5 hello
Il serait utile de comprendre pourquoi vous devez faire cela avec lodash. Si vous voulez juste vérifier si une clé existe dans un objet, vous n'avez pas besoin de lodash.
myObject.options.hasOwnProperty('property');
Si vous cherchez à savoir si une valeur existe, vous pouvez utiliser _.invert
_.invert(myObject.options)[value]
Vous pouvez certainement faire cela avec Vanilla JS comme l'a montré stecb, mais je pense que each
est la meilleure réponse à la question fondamentale relative à la façon de procéder avec lodash.
_.each( myObject.options, ( val, key ) => {
console.log( key, val );
} );
Comme JohnnyHK l'a mentionné, il existe également la méthode has
qui serait utile pour le cas d'utilisation, mais d'après ce qui a été déclaré à l'origine set
pourrait être plus utile. Supposons que vous vouliez ajouter quelque chose à cet objet de manière dynamique, comme vous l'avez mentionné:
let dynamicKey = 'someCrazyProperty';
let dynamicValue = 'someCrazyValue';
_.set( myObject.options, dynamicKey, dynamicValue );
Voilà comment je le ferais, basé sur la description originale.