JavaScriptオブジェクトのプロパティをループすることは可能ですか?たとえば、次のように定義されたJavaScriptオブジェクトがあります。
myObject.options = {
property1: 'value 1',
property2: 'value 2'
};
プロパティはこのオブジェクトに動的に追加されます。ループしてプロパティが存在するかどうかを確認する方法はありますか?もしそうなら、どうですか?
JavaScriptオブジェクトのプロパティをループすることは可能ですか?たとえば、次のように定義されたJavaScriptオブジェクトがあります。
myObject.options = {
property1: 'value 1',
property2: 'value 2'
};
プロパティはこのオブジェクトに動的に追加されます。ループしてプロパティが存在するかどうかを確認する方法はありますか?もしそうなら、どうですか?
回答:
はい、できます。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である必要があります
lodash
してこれを正当化することは、迷惑なhasOwnProperty
チェックを必要としないことによってのみ正当化されます
を使用し_.forOwn()
ます。
_.forOwn(obj, function(value, key) { } );
https://lodash.com/docs#forOwn
ご了承ください forOwn
のチェックはhasOwnProperty
、オブジェクトのプロパティをオーバーループするとき、あなたが通常必要とすることができません。forIn
このチェックは行いません。
key
は2番目のパラメーターですが、理にかなっています
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 );
元の説明に基づいて、このようにしました。
ES6では、for..of
ループを使用してオブジェクトの値を反復処理することもできます。ただし、オブジェクトに@@ iteratorプロパティを定義する必要があるため、JavaScriptオブジェクトの場合、これはすぐには機能しません。これは次のように機能します。
for..of
ループは(のイテレータオブジェクトのためにそれをOBJ1呼びましょう「オブジェクトを繰り返し処理するために、」要求されます。OBJ1以上のループ反復処理し、順次提供するイテレータオブジェクトのnext()メソッドを呼び出し、各反復の値として返された値を使用することにより、ループの。次に例を示します。
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