Durchlaufen Sie die Eigenschaften im JavaScript-Objekt mit Lodash

123

Ist es möglich, die Eigenschaften in einem JavaScript-Objekt zu durchlaufen? Zum Beispiel habe ich ein JavaScript-Objekt wie folgt definiert:

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

Eigenschaften werden diesem Objekt dynamisch hinzugefügt. Gibt es eine Möglichkeit für mich, einfach eine Schleife zu durchlaufen und zu überprüfen, ob eine Eigenschaft vorhanden ist? Wenn das so ist, wie?

user3111277
quelle

Antworten:

34

Ja, Sie können und lodash wird nicht benötigt ... dh

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

Bearbeiten : Die akzeptierte Antwort ( _.forOwn () ) sollte https://stackoverflow.com/a/21311045/528262 sein

stecb
quelle
6
+ Ich weiß, dass sie einen Lodash-Funktionsstil wollen. Meiner war nur eine Möglichkeit, dem OP verständlich zu machen, dass Sie ein Objekt in Abhängigkeit von einer Bibliothek schleifen können (falls er nur diese Funktionalität ohne
Lodash
39
In diesem Fall wäre es schön gewesen, beide Antworten zu geben.
Flq
1
Verwenden lodashund nicht dies ist nur dadurch gerechtfertigt, dass der nervige hasOwnPropertyScheck nicht benötigt wird
Mugen
600

Verwenden Sie _.forOwn().

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

https://lodash.com/docs#forOwn

Beachten Sie, dass forOwnÜberprüfungen durchgeführt werden hasOwnProperty, wie dies normalerweise beim Durchlaufen der Eigenschaften eines Objekts erforderlich ist. forInführt diese Prüfung nicht durch.

Djechlin
quelle
22
Sehr wichtig zu beachten, dass dies keyder zweite Parameter ist, aber es macht Sinn
Phil
18

Für Ihren erklärten Wunsch, "zu überprüfen, ob eine Eigenschaft vorhanden ist", können Sie Lo-Dash's direkt verwenden has.

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

Sie können dies definitiv mit Vanilla JS tun, wie stecb gezeigt hat, aber ich denke, es eachist die beste Antwort auf die Kernfrage, wie man es mit lodash macht.

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

Wie JohnnyHK erwähnt hat, gibt es auch die hasMethode, die für den Anwendungsfall hilfreich wäre, aber von dem, was ursprünglich angegeben wurde, setkann es nützlicher sein. Angenommen, Sie wollten diesem Objekt dynamisch etwas hinzufügen, wie Sie bereits erwähnt haben:

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

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

So würde ich es machen, basierend auf der ursprünglichen Beschreibung.

Kevin Leary
quelle
2

Nehmen wir als Beispiel das folgende Objekt

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

Holen Sie zuerst alle Schlüssel im Objekt

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

und dann durchlaufen

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

einfach alles zusammenfügen

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

In ES6 ist es auch möglich, die Werte eines Objekts mithilfe der for..ofSchleife zu durchlaufen . Dies funktioniert jedoch nicht sofort für JavaScript-Objekte, da Sie eine @@ Iterator-Eigenschaft für das Objekt definieren müssen. Dies funktioniert wie folgt:

  • Die for..ofSchleife fordert das "zu iterierende Objekt" auf (nennen wir es obj1 für ein Iteratorobjekt. Die Schleife iteriert über obj1, indem sie nacheinander die next () -Methode für das bereitgestellte Iteratorobjekt aufruft und den zurückgegebenen Wert als Wert für jede Iteration verwendet der Schleife.
  • Das Iteratorobjekt wird durch Aufrufen der in der Eigenschaft @@ iterator oder der Eigenschaft Symbol.iterator von obj1 definierten Funktion erhalten. Dies ist die Funktion, die Sie selbst definieren müssen und die ein Iteratorobjekt zurückgeben sollte

Hier ist ein Beispiel:

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

Jetzt können wir die for..ofSchleife verwenden:

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

Es wäre hilfreich zu verstehen, warum Sie dies mit lodash tun müssen. Wenn Sie nur überprüfen möchten, ob ein Schlüssel in einem Objekt vorhanden ist, benötigen Sie kein lodash.

myObject.options.hasOwnProperty('property');

Wenn Sie nach einem Wert suchen, können Sie diesen verwenden _.invert

_.invert(myObject.options)[value]
Barry G.
quelle