ikemonn's blog

技術ネタをちょこちょこと

【Underscore.js】_.uniqを読んだ

jashkenas/underscore_.uniqを読んだ。

概要

_.uniq(array, [isSorted], [iteratee]

arrayの各値の中で同じ値があった場合、1つだけにされ各値が重複のない配列として返される。配列がソートされている際に、isSortedをtrueにするとより高速に動作する。 値同士が等しいかどうかを評価する関数を渡すこともできる。

var list = [1, 10, 2, 3, 4, 1, 2, 3];
var x = _.uniq(list);
console.log(x); // [1, 10, 2, 3, 4]

ソースコード

  _.uniq = _.unique = function(array, isSorted, iteratee, context) {
    if (!_.isBoolean(isSorted)) {
      context = iteratee;
      iteratee = isSorted;
      isSorted = false;
    }
    if (iteratee != null) iteratee = cb(iteratee, context);
    var result = [];
    var seen = [];
    for (var i = 0, length = getLength(array); i < length; i++) {
      var value = array[i],
          computed = iteratee ? iteratee(value, i, array) : value;
      if (isSorted) {
        if (!i || seen !== computed) result.push(value);
        seen = computed;
      } else if (iteratee) {
        if (!_.contains(seen, computed)) {
          seen.push(computed);
          result.push(value);
        }
      } else if (!_.contains(result, value)) {
        result.push(value);
      }
    }
    return result;
  };

iterateeが与えられた時のseenは、iterateeで各値を評価したものがpushされていく。

} else if (iteratee) {
        if (!_.contains(seen, computed)) {
          seen.push(computed);
          result.push(value);
        }
} 

参考

jashkenas/underscore