You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
59 lines
1.7 KiB
JavaScript
59 lines
1.7 KiB
JavaScript
9 years ago
|
var baseIndexOf = require('../internal/baseIndexOf'),
|
||
|
cacheIndexOf = require('../internal/cacheIndexOf'),
|
||
|
createCache = require('../internal/createCache'),
|
||
|
isArrayLike = require('../internal/isArrayLike'),
|
||
|
restParam = require('../function/restParam');
|
||
|
|
||
|
/**
|
||
|
* Creates an array of unique values that are included in all of the provided
|
||
|
* arrays using [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)
|
||
|
* for equality comparisons.
|
||
|
*
|
||
|
* @static
|
||
|
* @memberOf _
|
||
|
* @category Array
|
||
|
* @param {...Array} [arrays] The arrays to inspect.
|
||
|
* @returns {Array} Returns the new array of shared values.
|
||
|
* @example
|
||
|
* _.intersection([1, 2], [4, 2], [2, 1]);
|
||
|
* // => [2]
|
||
|
*/
|
||
|
var intersection = restParam(function(arrays) {
|
||
|
var othLength = arrays.length,
|
||
|
othIndex = othLength,
|
||
|
caches = Array(length),
|
||
|
indexOf = baseIndexOf,
|
||
|
isCommon = true,
|
||
|
result = [];
|
||
|
|
||
|
while (othIndex--) {
|
||
|
var value = arrays[othIndex] = isArrayLike(value = arrays[othIndex]) ? value : [];
|
||
|
caches[othIndex] = (isCommon && value.length >= 120) ? createCache(othIndex && value) : null;
|
||
|
}
|
||
|
var array = arrays[0],
|
||
|
index = -1,
|
||
|
length = array ? array.length : 0,
|
||
|
seen = caches[0];
|
||
|
|
||
|
outer:
|
||
|
while (++index < length) {
|
||
|
value = array[index];
|
||
|
if ((seen ? cacheIndexOf(seen, value) : indexOf(result, value, 0)) < 0) {
|
||
|
var othIndex = othLength;
|
||
|
while (--othIndex) {
|
||
|
var cache = caches[othIndex];
|
||
|
if ((cache ? cacheIndexOf(cache, value) : indexOf(arrays[othIndex], value, 0)) < 0) {
|
||
|
continue outer;
|
||
|
}
|
||
|
}
|
||
|
if (seen) {
|
||
|
seen.push(value);
|
||
|
}
|
||
|
result.push(value);
|
||
|
}
|
||
|
}
|
||
|
return result;
|
||
|
});
|
||
|
|
||
|
module.exports = intersection;
|