web-dev-qa-db-fra.com

Boucle dans les propriétés d'un objet JavaScript avec Lodash

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?

110
user3111277

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

31
stecb

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.

569
djechlin

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);
16
JohnnyHK

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*/})
2
Akki geek

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:

  • La boucle 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.
  • L'objet itérateur est obtenu en appelant la fonction définie dans la propriété @@ iterator ou la propriété Symbol.iterator de obj1. C'est la fonction que vous devez définir vous-même et qui devrait retourner un objet itérateur

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
1
evianpring

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]
0
Barry G

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.

0
Kevin Leary