Scorri le proprietà nell'oggetto JavaScript con Lodash


123

È possibile scorrere le proprietà in un oggetto JavaScript? Ad esempio, ho un oggetto JavaScript definito come questo:

myObject.options = {
  property1: 'value 1',
  property2: 'value 2'
};

Le proprietà verranno aggiunte dinamicamente a questo oggetto. C'è un modo per me di fare un loop e controllare se esiste una proprietà? Se é cosi, come?

Risposte:


34

Sì, puoi e lodash non è necessario ... cioè

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];
  }
}

Modifica : la risposta accettata ( _.forOwn () ) dovrebbe essere https://stackoverflow.com/a/21311045/528262


6
+ So che vogliono lo stile funct lodash, il mio era solo un modo per far capire all'OP che puoi eseguire il loop di un oggetto senza che dipenda da una libreria (nel caso in cui desideri solo quella funzionalità senza incluso lodash)
stecb

39
In tal caso, fornire entrambe le risposte sarebbe stato carino.
flq

1
Questo utilizzo lodashe non è giustificato solo dal non aver bisogno del fastidioso hasOwnPropertycontrollo
Mugen

601

Usa _.forOwn().

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

https://lodash.com/docs#forOwn

Notare che i forOwncontrolli hasOwnProperty, come di solito è necessario fare quando si esegue il ciclo sulle proprietà di un oggetto. forInnon esegue questo controllo.


22
molto importante notare che keyè il secondo parametro, ma ha senso
Phil

18

Per il tuo desiderio dichiarato di "verificare se una proprietà esiste" puoi utilizzare direttamente Lo-Dash's has.

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

3

Puoi sicuramente farlo con vanilla JS come ha dimostrato stecb, ma penso che eachsia la risposta migliore alla domanda principale su come farlo con lodash.

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

Come menzionato da JohnnyHK, c'è anche il hasmetodo che sarebbe utile per il caso d'uso, ma da quanto originariamente affermato setpotrebbe essere più utile. Supponiamo che tu voglia aggiungere qualcosa a questo oggetto in modo dinamico come hai detto:

let dynamicKey = 'someCrazyProperty';
let dynamicValue = 'someCrazyValue';

_.set( myObject.options, dynamicKey, dynamicValue );

È così che lo farei, in base alla descrizione originale.


2

Prendiamo l'oggetto sotto come esempio

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

Per prima cosa recupera tutta la chiave nell'obj

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

e poi lo attraversi

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

solo mettendo tutto insieme

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

1

In ES6, è anche possibile iterare sui valori di un oggetto utilizzando il for..ofciclo. Tuttavia, questo non funziona immediatamente per gli oggetti JavaScript, poiché è necessario definire una proprietà @@ iterator sull'oggetto. Funziona come segue:

  • Il for..ofciclo chiede all '"oggetto di essere iterato" (chiamiamolo obj1 per un oggetto iteratore. Il ciclo itera su obj1 chiamando successivamente il metodo next () sull'oggetto iteratore fornito e usando il valore restituito come valore per ogni iterazione del ciclo.
  • L'oggetto iteratore si ottiene invocando la funzione definita nella proprietà @@ iterator, o nella proprietà Symbol.iterator, di obj1. Questa è la funzione che devi definire da solo e dovrebbe restituire un oggetto iteratore

Ecco un esempio:

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)
        };
      }
    };
  }
};

Ora possiamo usare il for..ofciclo:

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

0

Sarebbe utile capire perché è necessario farlo con lodash. Se vuoi solo controllare se una chiave esiste in un oggetto, non hai bisogno di lodash.

myObject.options.hasOwnProperty('property');

Se stai cercando di vedere se esiste un valore, puoi usare _.invert

_.invert(myObject.options)[value]
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.