ikemonn's blog

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

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

jashkenas/underscore_.intersectionを読んだ。

概要

_.intersection(*arrays) 

第一引数の配列の各値の中で、第二引数以降のすべての配列に含まれている値を返す。

var x = _.intersection([1, 10, 10, 3], [3 ,190, 10], [1, 545, 3, 10]);
console.log(x); // [10, 3]

ソースコード

_.intersection = function(array) {
    var result = [];
    var argsLength = arguments.length;
    for (var i = 0, length = getLength(array); i < length; i++) {
      var item = array[i];
      if (_.contains(result, item)) continue;
      for (var j = 1; j < argsLength; j++) {
        if (!_.contains(arguments[j], item)) break;
      }
      if (j === argsLength) result.push(item);
    }
    return result;
  };

第一引数の各値が、第二引数以降の配列にも含まれているかを_.containを使って調べている。

for (var j = 1; j < argsLength; j++) {
        if (!_.contains(arguments[j], item)) break;
      }
      if (j === argsLength) result.push(item);

}

上記の処理は、すべての配列にitem(第一引数の値)が含まれているかを調べている部分。 引数で与えられた配列の数だけjがインクリメントされていれば、すべての配列に値が含まれている。

参考

jashkenas/underscore