Lodashを使用してJavaScriptオブジェクトのプロパティをループする


123

JavaScriptオブジェクトのプロパティをループすることは可能ですか?たとえば、次のように定義されたJavaScriptオブジェクトがあります。

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

プロパティはこのオブジェクトに動的に追加されます。ループしてプロパティが存在するかどうかを確認する方法はありますか?もしそうなら、どうですか?

回答:


34

はい、できます。lodashは必要ありません...すなわち

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

編集:受け入れられた回答(_.forOwn())はhttps://stackoverflow.com/a/21311045/528262である必要があります


6
+私は彼らがlodash機能的なスタイルを望んでいることを知っています、私はOPにライブラリに応じてオブジェクトなしでオブジェクトをループできることを理解させる方法でした(彼がlodashを含めずにその機能を必要とする場合のみ)
stecb

39
その場合、両方の答えを提供することは素晴らしいことでしょう。
flq 2015

1
使用lodashしてこれを正当化することは、迷惑なhasOwnPropertyチェックを必要としないことによってのみ正当化されます
Mugen

600

を使用し_.forOwn()ます。

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

https://lodash.com/docs#forOwn

ご了承ください forOwnのチェックはhasOwnProperty、オブジェクトのプロパティをオーバーループするとき、あなたが通常必要とすることができません。forInこのチェックは行いません。


22
これkeyは2番目のパラメーターですが、理にかなっています
Phil

18

「プロパティが存在するかどうかを確認する」という指定の要望に対しては、直接Lo-Dashを使用できますhas

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

3

stecbが示したようなバニラJSでこれを確実に行うことができますeachが、lodashでそれを行う方法に関する中心的な質問に対する最良の答えは私です。

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

JohnnyHKが言及したように、hasユースケースに役立つ方法もありますが、最初に述べたset方法の方が役立つ場合があります。あなたが言及したように、このオブジェクトに何かを動的に追加したいとしましょう:

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

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

元の説明に基づいて、このようにしました。


2

以下のオブジェクトを例に考えてみましょう

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

まず、obj内のすべてのキーをフェッチします

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

そしてそれをループします

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

すべてをまとめるだけ

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

1

ES6では、for..ofループを使用してオブジェクトの値を反復処理することもできます。ただし、オブジェクトに@@ iteratorプロパティを定義する必要があるため、JavaScriptオブジェクトの場合、これはすぐには機能しません。これは次のように機能します。

  • for..ofループは(のイテレータオブジェクトのためにそれをOBJ1呼びましょう「オブジェクトを繰り返し処理するために、」要求されます。OBJ1以上のループ反復処理し、順次提供するイテレータオブジェクトのnext()メソッドを呼び出し、各反復の値として返された値を使用することにより、ループの。
  • イテレータオブジェクトは、obj1の@@ iteratorプロパティまたはSymbol.iteratorプロパティで定義された関数を呼び出すことによって取得されます。これは、自分で定義する必要がある関数であり、イテレータオブジェクトを返す必要があります

次に例を示します。

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

これでfor..ofループを使用できます。

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

0

lodashでこれを行う必要がある理由を理解しておくと役に立ちます。オブジェクトにキーが存在するかどうかを確認するだけの場合は、lodashは必要ありません。

myObject.options.hasOwnProperty('property');

値が存在するかどうかを確認したい場合は、 _.invert

_.invert(myObject.options)[value]
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.