いい加減配列のループにはArray#forEach
を使っていきたいと思っています。
通常の配列であれば下記のような感じ。
var array = ['暁', '響', '雷', '電']; array.forEach(function(val, i) { console.log(i, elmval; }); /* ↓ 出力 0 "暁" 1 "響" 2 "雷" 3 "電" */
連想配列をforEachでループさせる
しかし連想配列(オブジェクト)の場合
var obj = { first: '暁', second: '響', third: '雷', fourth: '電' }; obj.forEach(function(val, key) { console.log(key, val); }); // => Uncaught TypeError: obj.forEach is not a function
そのまま Object.forEach
とするとエラーになってしまいます。
Object.keys() で連想配列のキーを配列にして利用する
連想配列(オブジェクト)をforEachで回すにはキーの配列を利用すればOK... なのだけど
var obj = { first: '暁', second: '響', third: '雷', fourth: '電' }; Object.keys(obj).forEach(function(key) { console.log(key, obj[key]); }); /* ↓ 出力 first 暁 second 響 third 雷 fourth 電 */
ループ内で obj[key]
ってループの外にある変数を参照するのがイケてない...
forEachの第二引数にオブジェクトを渡してあげればOK!
array.forEach(callback[, thisObj]);
引数
callback
... 各要素に対して実行するコールバック関数で、3つの引数をとります。
thisObj
... 任意。callback 内で this として使用する値
どうやら、forEach()
の第二引数に渡した値がループ内でthis
として使用できるようなので、第二引数にオブジェクトを渡すと良い感じになりそうです。
var obj = { first: '暁', second: '響', third: '雷', fourth: '電' }; // 第二引数に obj を渡す Object.keys(obj).forEach(function(key) { var val = this[key]; // this は obj console.log(key, val); }, obj); /* ↓ 出力 first 暁 second 響 third 雷 fourth 電 */
ループ内でループ外の変数を参照させること無く連想配列(オブジェクト)をforEach()
でループさせることが出来ました!
今頃こんなエントリーを書いているのは、未だにES2015は疎か、ES5もちゃんと把握できてないって事...
そろそろヤバイ感あるぞ... (今後もまっとうなエンジニアとしてやっていくのなら)
[参考]
- Array.prototype.forEach() - JavaScript | MDN
- JavaScript Array.forEachとjQuery.eachの違い - Qiita
- ES2015(ES6)な時代だからこそ、ES5を改めて調べたJavaScript初級者のメモ - Qiita

- 作者: Nicholas C. Zakas,和田祐一郎
- 出版社/メーカー: オライリージャパン
- 発売日: 2014/06/18
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (4件) を見る