underscore.jsで気になる関数(collections、arrays編)

2回目にして、もうネタ切れ気味になってきた新人のMです。

ネタ切れ気味なので、今日は軽めにUnderscore.jsで気に入ってる関数を幾つか紹介します。

Collections

一般的なmap・reduce・filter系ですが、jsのmap関数はArrayのメソッドだったりするので、Hashにも適用できるのは便利です。特に便利だと思うものをピックアップします。

_.pluck(list, propertyName)

プロパティ名に指定したものをmapしてくれます。

var stooges = [{name: 'moe', age: 40}, {name: 'larry', age: 50}, {name: 'curly', age: 60}];
_.pluck(stooges, 'name');
=> ["moe", "larry", "curly"]

_.groupBy(list, iterator, [context])系

iteratorの返り値でグルーピングしてくれます。

_.groupBy([1.3, 2.1, 2.4], function(num){ return Math.floor(num); });
=> {1: [1.3], 2: [2.1, 2.4]}

_.groupBy(['one', 'two', 'three'], 'length');
=> {3: ["one", "two"], 5: ["three"]}

var stooges = [{name: 'moe', age: 40}, {name: 'larry', age: 50}, {name: 'curly', age: 60}];
_.indexBy(stooges, 'age');
=> {
  "40": {name: 'moe', age: 40},
  "50": {name: 'larry', age: 50},
  "60": {name: 'curly', age: 60}
}

_.countBy([1, 2, 3, 4, 5], function(num) {
  return num % 2 == 0 ? 'even': 'odd';
});
=> {odd: 3, even: 2}

Arrays

_.without(array, [*values])

arrayからvaluesに含まれるものを除外したArrayを返してくれます。chainで使うと便利です。

_.without([1, 2, 1, 0, 3, 1, 4], 0, 1);
=> [2, 3, 4]

_.union(*arrays)

和を取ってくれます

_.union([1, 2, 3], [101, 2, 1, 10], [2, 1]);
=> [1, 2, 3, 101, 10]

_.intersection(*arrays)

積を取ってくれます

_.intersection([1, 2, 3], [101, 2, 1, 10], [2, 1]);
=> [1, 2]

_.difference(array, *others)

差を取ってくれます。処理の前後で追加・削除の検出に便利です。

_.difference([1, 2, 3, 4, 5], [5, 2, 10]);
=> [1, 3, 4]

_.uniq(array, [isSorted], [iterator])

重複を取ってくれます

_.uniq([1, 2, 1, 3, 1, 4]);
=> [1, 2, 3, 4]

_.range([start], stop, [step])

一般的なrange関数です

_.range(10);
=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
_.range(1, 11);
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
_.range(0, 30, 5);
=> [0, 5, 10, 15, 20, 25]
_.range(0, -10, -1);
=> [0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
_.range(0);
=> []

一旦まとめ

Functions、Objects、Utilityにも便利な関数がたくさんあるのですが、長くなりそうなので、今日はこのへんで。

Collections、Arraysには最近の言語だと標準関数で備わってるものが多いですが、今のjsだと使いにくいものも多いので、こういったライブラリで補完すると大変楽です。

underscore.jsは、一般的に使われてる便利なutilityライブラリです。聞いたことあるけど、まだ使ってないって方はこの機会に導入を検討してみてはいかがでしょうか?