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];
}
}
Edit:受け入れられる回答( _。forOwn() )は https://stackoverflow.com/a/21311045/528262
_.forOwn()
を使用します。
_.forOwn(obj, function(value, key) { } );
https://lodash.com/docs#forOwn
forOwn
はhasOwnProperty
をチェックすることに注意してください。これは通常、オブジェクトのプロパティをループするときに行う必要があります。 forIn
はこのチェックを行いません。
「プロパティが存在するかどうかを確認する」という明確な要望に対して、Lo-Dashの has
を直接使用できます。
var exists = _.has(myObject, propertyNameToCheck);
以下のオブジェクトを例としてみましょう
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*/})
ES6では、for..of
ループを使用してオブジェクトの値を反復処理することもできます。ただし、JavaScriptオブジェクトの場合はすぐに動作しません。オブジェクトで@@ iteratorプロパティを定義する必要があるためです。これは次のように機能します。
for..of
ループは、「反復されるオブジェクト」を要求します(反復子オブジェクトに対してobj1を呼び出します。ループは、指定された反復子オブジェクトでnext()メソッドを連続して呼び出し、戻り値をそれぞれの値として使用してobj1を反復しますループの反復。以下に例を示します。
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
Lodashでこれを行う必要がある理由を理解しておくと役立ちます。オブジェクトにキーが存在するかどうかだけを確認する場合は、lodashは必要ありません。
myObject.options.hasOwnProperty('property');
値が存在するかどうかを確認する場合は、_.invert
を使用できます
_.invert(myObject.options)[value]
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 );
それは、元の説明に基づいて、私がそれをする方法です。