オブジェクトをループする方法
JavaScript・TypeScriptでオブジェクトのプロパティをループする方法を説明します。
for-in文
JavaScriptでオブジェクトをループする古くからある方法はfor-in文を使うものです。
js
constfoo = {a : 1,b : 2,c : 3 };for (constprop infoo ) {console .log (prop ,foo [prop ]);// a 1// b 2// c 3 の順で出力される}
js
constfoo = {a : 1,b : 2,c : 3 };for (constprop infoo ) {console .log (prop ,foo [prop ]);// a 1// b 2// c 3 の順で出力される}
for-in文ではhasOwnProperty
を使おう
JavaScriptのオブジェクトには元になるプロトタイプがあります。たとえば、オブジェクトリテラルであれば、Object.prototype
がプロトタイプになります。
js
constfoo = {a : 1,b : 2,c : 3 };console .log (Object .getPrototypeOf (foo ) ===Object .prototype );
js
constfoo = {a : 1,b : 2,c : 3 };console .log (Object .getPrototypeOf (foo ) ===Object .prototype );
Object.prototype
を変更するとその影響は、このプロトタイプを持つすべてのオブジェクトに影響します。
js
constfoo = {a : 1 };constdate = newDate ();constarr = [1, 2, 3];// どのオブジェクトもhiプロパティが無いことを確認console .log (foo .hi ,date .hi ,arr .hi );// プロトタイプにプロパティを追加するObject .prototype .hi = "Hi!";// どのオブジェクトもhiプロパティを持つようになるconsole .log (foo .hi ,date .hi ,arr .hi );
js
constfoo = {a : 1 };constdate = newDate ();constarr = [1, 2, 3];// どのオブジェクトもhiプロパティが無いことを確認console .log (foo .hi ,date .hi ,arr .hi );// プロトタイプにプロパティを追加するObject .prototype .hi = "Hi!";// どのオブジェクトもhiプロパティを持つようになるconsole .log (foo .hi ,date .hi ,arr .hi );
for-in文はプロトタイプのプロパティも含めてループする仕様があります。そのため、プロトタイプが変更されると、意図しないところでfor-inのループ回数が変わることがあります。
js
constfoo = {a : 1,b : 2,c : 3 };Object .prototype .hi = "Hi!";for (constprop infoo ) {console .log (prop ,foo [prop ]);// a 1// b 2// c 3// hi Hi! の順で出力される}
js
constfoo = {a : 1,b : 2,c : 3 };Object .prototype .hi = "Hi!";for (constprop infoo ) {console .log (prop ,foo [prop ]);// a 1// b 2// c 3// hi Hi! の順で出力される}
したがって、for-inで反復処理を書く場合は、hasOwnProperty
でプロパティがプロトタイプのものでないことをチェックしたほうが安全です。
js
constfoo = {a : 1,b : 2,c : 3 };Object .prototype .hi = "Hi!";for (constprop infoo ) {if (Object .prototype .hasOwnProperty .call (foo ,prop )) {console .log (prop ,foo [prop ]);// a 1// b 2// c 3 の順で出力される}}
js
constfoo = {a : 1,b : 2,c : 3 };Object .prototype .hi = "Hi!";for (constprop infoo ) {if (Object .prototype .hasOwnProperty .call (foo ,prop )) {console .log (prop ,foo [prop ]);// a 1// b 2// c 3 の順で出力される}}
Object.entries
Object.entries
の戻り値をfor-of文でループする方法もあります。
ts
constfoo = {a : 1,b : 2,c : 3 };for (const [key ,value ] ofObject .entries (foo )) {console .log (key ,value );// a 1// b 2// c 3 の順で出力される}
ts
constfoo = {a : 1,b : 2,c : 3 };for (const [key ,value ] ofObject .entries (foo )) {console .log (key ,value );// a 1// b 2// c 3 の順で出力される}
for-in文と異なり、hasOwnProperty
のチェックが不要です。
Object.keys
プロパティのキーだけを反復処理する場合は、Object.key
の戻り値をfor-of文でループする方法があります。
ts
constfoo = {a : 1,b : 2,c : 3 };for (constkey ofObject .keys (foo )) {console .log (key );// a// b// c の順で出力される}
ts
constfoo = {a : 1,b : 2,c : 3 };for (constkey ofObject .keys (foo )) {console .log (key );// a// b// c の順で出力される}
for-in文と異なり、hasOwnProperty
のチェックが不要です。
Object.values
プロパティの値だけを反復処理する場合は、Object.values
の戻り値をfor-of文でループする方法があります。
ts
constfoo = {a : 1,b : 2,c : 3 };for (constvalue ofObject .values (foo )) {console .log (value );// 1// 2// 3 の順で出力される}
ts
constfoo = {a : 1,b : 2,c : 3 };for (constvalue ofObject .values (foo )) {console .log (value );// 1// 2// 3 の順で出力される}
for-in文と異なり、hasOwnProperty
のチェックが不要です。
学びをシェアする
JavaScriptやTypeScriptのオブジェクトプロパティをループするには次の方法がある。
1️⃣ for-in文
2️⃣ for-of文 + Object.entries()
3️⃣ for-of文 + Object.keys()
4️⃣ for-of文 + Object.values()
⚠️ for-in文はhasOwnPropertyのチェックが必要。
『サバイバルTypeScript』より