| var SetCache = require('./_SetCache'), |
| arrayIncludes = require('./_arrayIncludes'), |
| arrayIncludesWith = require('./_arrayIncludesWith'), |
| arrayMap = require('./_arrayMap'), |
| baseUnary = require('./_baseUnary'), |
| cacheHas = require('./_cacheHas'); |
| |
| /** Used as the size to enable large array optimizations. */ |
| var LARGE_ARRAY_SIZE = 200; |
| |
| /** |
| * The base implementation of methods like `_.difference` without support |
| * for excluding multiple arrays or iteratee shorthands. |
| * |
| * @private |
| * @param {Array} array The array to inspect. |
| * @param {Array} values The values to exclude. |
| * @param {Function} [iteratee] The iteratee invoked per element. |
| * @param {Function} [comparator] The comparator invoked per element. |
| * @returns {Array} Returns the new array of filtered values. |
| */ |
| function baseDifference(array, values, iteratee, comparator) { |
| var index = -1, |
| includes = arrayIncludes, |
| isCommon = true, |
| length = array.length, |
| result = [], |
| valuesLength = values.length; |
| |
| if (!length) { |
| return result; |
| } |
| if (iteratee) { |
| values = arrayMap(values, baseUnary(iteratee)); |
| } |
| if (comparator) { |
| includes = arrayIncludesWith; |
| isCommon = false; |
| } |
| else if (values.length >= LARGE_ARRAY_SIZE) { |
| includes = cacheHas; |
| isCommon = false; |
| values = new SetCache(values); |
| } |
| outer: |
| while (++index < length) { |
| var value = array[index], |
| computed = iteratee == null ? value : iteratee(value); |
| |
| value = (comparator || value !== 0) ? value : 0; |
| if (isCommon && computed === computed) { |
| var valuesIndex = valuesLength; |
| while (valuesIndex--) { |
| if (values[valuesIndex] === computed) { |
| continue outer; |
| } |
| } |
| result.push(value); |
| } |
| else if (!includes(values, computed, comparator)) { |
| result.push(value); |
| } |
| } |
| return result; |
| } |
| |
| module.exports = baseDifference; |