web-dev-qa-db-ja.com

LodashでJavaScriptオブジェクトのプロパティをループする

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

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

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

107
user3111277

はい、できます。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];
  }
}

Edit:受け入れられる回答( _。forOwn() )は https://stackoverflow.com/a/21311045/528262

31
stecb

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

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

https://lodash.com/docs#forOwn

forOwnhasOwnPropertyをチェックすることに注意してください。これは通常、オブジェクトのプロパティをループするときに行う必要があります。 forInはこのチェックを行いません。

562
djechlin

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

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

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

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

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

  • for..ofループは、「反復されるオブジェクト」を要求します(反復子オブジェクトに対してobj1を呼び出します。ループは、指定された反復子オブジェクトでnext()メソッドを連続して呼び出し、戻り値をそれぞれの値として使用してobj1を反復しますループの反復。
  • 反復子オブジェクトは、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
1
evianpring

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

myObject.options.hasOwnProperty('property');

値が存在するかどうかを確認する場合は、_.invertを使用できます

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

Stecbが示したように、Vanilla 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 );

それは、元の説明に基づいて、私がそれをする方法です。

0
Kevin Leary