You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					75 lines
				
				2.2 KiB
			
		
		
			
		
	
	
					75 lines
				
				2.2 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								var SetCache = require('./_SetCache'),
							 | 
						||
| 
								 | 
							
								    arrayIncludes = require('./_arrayIncludes'),
							 | 
						||
| 
								 | 
							
								    arrayIncludesWith = require('./_arrayIncludesWith'),
							 | 
						||
| 
								 | 
							
								    arrayMap = require('./_arrayMap'),
							 | 
						||
| 
								 | 
							
								    baseUnary = require('./_baseUnary'),
							 | 
						||
| 
								 | 
							
								    cacheHas = require('./_cacheHas');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* Built-in method references for those with the same name as other `lodash` methods. */
							 | 
						||
| 
								 | 
							
								var nativeMin = Math.min;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * The base implementation of methods like `_.intersection`, without support
							 | 
						||
| 
								 | 
							
								 * for iteratee shorthands, that accepts an array of arrays to inspect.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @private
							 | 
						||
| 
								 | 
							
								 * @param {Array} arrays The arrays to inspect.
							 | 
						||
| 
								 | 
							
								 * @param {Function} [iteratee] The iteratee invoked per element.
							 | 
						||
| 
								 | 
							
								 * @param {Function} [comparator] The comparator invoked per element.
							 | 
						||
| 
								 | 
							
								 * @returns {Array} Returns the new array of shared values.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								function baseIntersection(arrays, iteratee, comparator) {
							 | 
						||
| 
								 | 
							
								  var includes = comparator ? arrayIncludesWith : arrayIncludes,
							 | 
						||
| 
								 | 
							
								      length = arrays[0].length,
							 | 
						||
| 
								 | 
							
								      othLength = arrays.length,
							 | 
						||
| 
								 | 
							
								      othIndex = othLength,
							 | 
						||
| 
								 | 
							
								      caches = Array(othLength),
							 | 
						||
| 
								 | 
							
								      maxLength = Infinity,
							 | 
						||
| 
								 | 
							
								      result = [];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  while (othIndex--) {
							 | 
						||
| 
								 | 
							
								    var array = arrays[othIndex];
							 | 
						||
| 
								 | 
							
								    if (othIndex && iteratee) {
							 | 
						||
| 
								 | 
							
								      array = arrayMap(array, baseUnary(iteratee));
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    maxLength = nativeMin(array.length, maxLength);
							 | 
						||
| 
								 | 
							
								    caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120))
							 | 
						||
| 
								 | 
							
								      ? new SetCache(othIndex && array)
							 | 
						||
| 
								 | 
							
								      : undefined;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  array = arrays[0];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  var index = -1,
							 | 
						||
| 
								 | 
							
								      seen = caches[0];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  outer:
							 | 
						||
| 
								 | 
							
								  while (++index < length && result.length < maxLength) {
							 | 
						||
| 
								 | 
							
								    var value = array[index],
							 | 
						||
| 
								 | 
							
								        computed = iteratee ? iteratee(value) : value;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    value = (comparator || value !== 0) ? value : 0;
							 | 
						||
| 
								 | 
							
								    if (!(seen
							 | 
						||
| 
								 | 
							
								          ? cacheHas(seen, computed)
							 | 
						||
| 
								 | 
							
								          : includes(result, computed, comparator)
							 | 
						||
| 
								 | 
							
								        )) {
							 | 
						||
| 
								 | 
							
								      othIndex = othLength;
							 | 
						||
| 
								 | 
							
								      while (--othIndex) {
							 | 
						||
| 
								 | 
							
								        var cache = caches[othIndex];
							 | 
						||
| 
								 | 
							
								        if (!(cache
							 | 
						||
| 
								 | 
							
								              ? cacheHas(cache, computed)
							 | 
						||
| 
								 | 
							
								              : includes(arrays[othIndex], computed, comparator))
							 | 
						||
| 
								 | 
							
								            ) {
							 | 
						||
| 
								 | 
							
								          continue outer;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      if (seen) {
							 | 
						||
| 
								 | 
							
								        seen.push(computed);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      result.push(value);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  return result;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								module.exports = baseIntersection;
							 |