differenceWith.js 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738
  1. var baseDifference = require('./_baseDifference'),
  2. baseFlatten = require('./_baseFlatten'),
  3. isArrayLikeObject = require('./isArrayLikeObject'),
  4. last = require('./last'),
  5. rest = require('./rest');
  6. /**
  7. * This method is like `_.difference` except that it accepts `comparator`
  8. * which is invoked to compare elements of `array` to `values`. Result values
  9. * are chosen from the first array. The comparator is invoked with two arguments:
  10. * (arrVal, othVal).
  11. *
  12. * @static
  13. * @memberOf _
  14. * @since 4.0.0
  15. * @category Array
  16. * @param {Array} array The array to inspect.
  17. * @param {...Array} [values] The values to exclude.
  18. * @param {Function} [comparator] The comparator invoked per element.
  19. * @returns {Array} Returns the new array of filtered values.
  20. * @example
  21. *
  22. * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
  23. *
  24. * _.differenceWith(objects, [{ 'x': 1, 'y': 2 }], _.isEqual);
  25. * // => [{ 'x': 2, 'y': 1 }]
  26. */
  27. var differenceWith = rest(function(array, values) {
  28. var comparator = last(values);
  29. if (isArrayLikeObject(comparator)) {
  30. comparator = undefined;
  31. }
  32. return isArrayLikeObject(array)
  33. ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), undefined, comparator)
  34. : [];
  35. });
  36. module.exports = differenceWith;