Parcourir les propriétés dans un objet JavaScript avec Lodash


123

Est-il possible de parcourir les propriétés d'un objet JavaScript? Par exemple, j'ai un objet JavaScript défini comme suit:

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?

Réponses:


34

Oui, vous pouvez et lodash n'est pas nécessaire ... ie

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 () ) doit être https://stackoverflow.com/a/21311045/528262


6
+ Je sais qu'ils veulent un style funct lodash, le mien était juste un moyen de faire comprendre à l'OP que vous pouvez boucler un objet sans fonction de bibliothèque (au cas où il voudrait juste cette fonctionnalité sans lodash)
stecb

39
Dans ce cas, fournir les deux réponses aurait été bien.
flq

1
utiliser lodashet non cela n'est justifié que par le fait de ne pas avoir besoin de la hasOwnPropertyvérification ennuyeuse
Mugen

601

Utilisez _.forOwn().

_.forOwn(obj, function(value, key) { } );

https://lodash.com/docs#forOwn

Notez que les forOwnvérifications hasOwnProperty, comme vous devez généralement le faire lors de la boucle sur les propriétés d'un objet. forInne fait pas cette vérification.


22
très important de noter que keyc'est le deuxième paramètre, mais cela a du sens
Phil

18

Pour votre désir déclaré de "vérifier si une propriété existe", vous pouvez directement utiliser Lo-Dash's has.

var exists = _.has(myObject, propertyNameToCheck);

3

Vous pouvez certainement le faire avec vanilla JS comme l'a montré stecb, mais je pense que eachc'est la meilleure réponse à la question fondamentale concernant la façon de le faire avec lodash.

_.each( myObject.options, ( val, key ) => { 
    console.log( key, val ); 
} );

Comme JohnnyHK l'a mentionné, il existe également la hasméthode qui serait utile pour le cas d'utilisation, mais à partir de ce qui est initialement indiqué, elle setpeut être plus utile. Disons 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 );

C'est comme ça que je ferais, basé sur la description originale.


2

Prenons l'objet ci-dessous comme exemple

let obj = { property1: 'value 1', property2: 'value 2'};

Récupérez d'abord toutes les clés de l'objet

let keys = Object.keys(obj) //it will return array of keys

puis bouclez-le

keys.forEach(key => //your way)

juste mettre tout ensemble

Object.keys(obj).forEach(key=>{/*code here*/})

1

Dans ES6, il est également possible d'itérer sur les valeurs d'un objet à l'aide de la for..ofboucle. Cela ne fonctionne pas tout de suite pour les objets JavaScript, car vous devez définir une propriété @@ iterator sur l'objet. Cela fonctionne comme suit:

  • La for..ofboucle demande "l'objet à itérer sur" (appelons-le obj1 pour un objet itérateur. La boucle effectue une itération sur obj1 en appelant successivement la méthode next () sur l'objet itérateur fourni et en utilisant la valeur renvoyée comme 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 elle doit renvoyer 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)
        };
      }
    };
  }
};

Maintenant, nous pouvons utiliser la for..ofboucle:

for (val of obj1) {
  console.log(val);
}    // 5 hello

0

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 à voir si une valeur existe, vous pouvez utiliser _.invert

_.invert(myObject.options)[value]
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.