35 lines
1.4 KiB
JavaScript
35 lines
1.4 KiB
JavaScript
import { uniqWith as uniqWith$1 } from "../../array/uniqWith.mjs";
|
|
import { isArrayLike } from "../predicate/isArrayLike.mjs";
|
|
import { uniq } from "./uniq.mjs";
|
|
//#region src/compat/array/uniqWith.ts
|
|
/**
|
|
* This method is like `uniq`, except that it accepts a `comparator` which is used to determine the equality of elements.
|
|
*
|
|
* It creates a duplicate-free version of an array, in which only the first occurrence of each element is kept.
|
|
* If a `comparator` is provided, it will be invoked with two arguments: `(arrVal, othVal)` to compare elements.
|
|
* If no comparator is provided, shallow equality is used.
|
|
*
|
|
* The order of result values is determined by the order they appear in the input array.
|
|
*
|
|
* @template T - The type of elements in the array.
|
|
* @param {ArrayLike<T> | null | undefined} arr - The array to process.
|
|
* @param {Comparator<T>} [comparator] - Optional function to compare elements for equality.
|
|
* @returns {T[]} A new array with only unique values based on the comparator.
|
|
*
|
|
* @example
|
|
* const array = [1, 2, 2, 3];
|
|
* const result = uniqWith(array);
|
|
* // result will be [1, 2, 3]
|
|
*
|
|
* const array = [1, 2, 3];
|
|
* const result = uniqWith(array, (a, b) => a % 2 === b % 2)
|
|
* // result will be [1, 2]
|
|
*/
|
|
function uniqWith(arr, comparator) {
|
|
if (!isArrayLike(arr)) return [];
|
|
if (typeof comparator !== "function") return uniq(Array.from(arr));
|
|
return uniqWith$1(Array.from(arr), (kept, candidate) => comparator(candidate, kept));
|
|
}
|
|
//#endregion
|
|
export { uniqWith };
|