引数「配列」の各値の中で同じ値があった場合、1つだけにされ(他のindex値の値は削除)各値が重複のない配列として返される。
■使用例
var arr = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 4, 5, 7, 9, false, undefined, undefined ];
// re = [ 0,1,2,3,4,5,6,7,8,9,10,false,undefined ];
var re = _.uniq( arr );
var arr = [ 0, 1, 2, 10, 2 ];
// re = [ 0,1,2,10 ];
var re = _.uniq( arr );
■内部構造
_.uniq = _.unique = function(array, isSorted, iteratee, context) {
// 第1引数が null の時は空の配列が返る。
if (array == null) return [];
// _.isBoolean() は「true」「false」の時、trueを返すので 第2引数が「undefined」「null」の時などの処理。
if (!_.isBoolean(isSorted)) {
context = iteratee;
iteratee = isSorted;
isSorted = false;
}
// iteratee が空じゃない時。
if (iteratee != null) iteratee = cb(iteratee, context);
var result = [];
var seen = [];
// 各値を処理するforループ。
for (var i = 0, length = array.length; i < length; i++) {
var value = array[i],
// iteratee がある時は iteratee で第1引数「配列」の値を処理した結果。iteratee がない場合は値そのまま。
computed = iteratee ? iteratee(value, i, array) : value;
if (isSorted) {
// isSorted = true の時の処理。
// 前の値と違う時
if (!i || seen !== computed) result.push(value);
seen = computed;
} else if (iteratee) {
// iteratee = true の時の処理。
// seen配列に値がない時。
if (!_.contains(seen, computed)) {
seen.push(computed);
result.push(value);
}
// 引数が配列のみで、値が result 配列にない時。
} else if (!_.contains(result, value)) {
result.push(value);
}
}
// 重複していない値が入る配列が返される。
return result;
};