|                                                                   |  | 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;
 |