【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); } }