2014年11月6日木曜日

ループをmapにしよう

ちょっと仕事で書いたソースコードの一部を貼り付けます。

JavaScriptでmapを使った例です。


"id"という数値のプロパティを持ったオブジェクトの配列があるとして、
その中から一番大きい"id"に1を足したものを取得する処理です。

var hogeList = [{id:10, name:"Huga"}, {id:65, name:"Foo"}, {id:22, name:"Bar"}];

var nextId = Math.max.apply(null, [0].concat(hogeList.map(function (e) { return e.id; }))) + 1;

これを実行すると、
nextIdに66が代入されるはずです。


簡単に解説しますと、
map関数でオブジェクトの配列を"id"の配列に変換します。

そしてmax関数で最大値を求めてから1を足しています。

途中にconcat関数があるのは、
配列が空だったときの対策です。

maxは空配列を渡すとNaNを返してしまうので、
0がひとつだけ入った配列を足して空配列にならないようにしています。


これは簡単な例ですけど、
普段for文でループしていた処理がmapに置き換わっています。

まあコールバック関数を書かなければならないのはデメリットですが、
コールバック関数が別の場所で定義されていればどれだけ簡単になるかご理解いただけるでしょうか。

そしてmapが並列に実行されるとすれば…

0 件のコメント:

コメントを投稿