CCCPaste

baseDifference.js

function baseDifference(array, values, iteratee, comparator) {
  let index = -1;
  let length = array.length;
  let result = [];

  let includes = arrayIncludes;
  let isCommon = true;

  if (!length) {
    return result;
  }

  if (iteratee) {
    values = values.map(iteratee);
  }

  if (comparator) {
    includes = arrayIncludesWith;
    isCommon = false;
  } else if (values.length >= 200) {
    includes = cacheHas;
    isCommon = false;
    values = new SetCache(values);
  }

  outer:
  while (++index < length) {
    let value = array[index];
    let computed = iteratee == null ? value : iteratee(value);

    if (isCommon && computed === computed) {
      let valuesIndex = values.length;
      while (valuesIndex--) {
        if (values[valuesIndex] === computed) {
          continue outer;
        }
      }
      result.push(value);
    } else if (!includes(values, computed, comparator)) {
      result.push(value);
    }
  }

  return result;
}