Hail2u

reduce()を使った配列要素のユニーク化

普通のやつは、要素ごとにindexOf()で結果を格納する配列から探して、なかったら追加みたいなの。ソートされてる前提だとindexOf()じゃなくて最後の要素と比較すれば良いだけなので速い。Underscore.jsではこれらに加えてもうちょっと複雑なことをしつつユニークにできる。普通はこれらであまり困らないけど、最近知ったreduce()を使った奴が面白かった。

var array = [0, 1, 4, 2, 1, 4, 0, 3, 4, 2];
var unique = array.reduce(function (a, b) {
  if (a.indexOf(b) < 0) {
    a.push(b);
  }

  return a;
}, []);
console.log(unique); // [0, 1, 4, 2, 3]

reduce()は第一引数に指定した関数で配列の要素を順に処理する時に、返り値を次の要素にどんどん渡していくもの。第二引数には初期値を渡せ、その値と最初の要素を使った処理を最初に行える。ユニークにした結果を格納する配列を第二引数として渡してやり、indexOf()で調べていき、見つからなかったら追加し、最後に配列を返すというのを繰り返すことでユニーク化を実現している。


reduce()join()のすごいやつみたいな印象でしかなくて、こういう風に配列の要素と最終的な結果の型が違う形で使おうと考えたことがなかったのでちょっと新鮮。使うか使わないかって言ったら使わないけれど。