uniq() | Underscore JS 日本語リファレンス

引数「配列」の各値の中で同じ値があった場合、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;
  };

このページのトップへ戻る