locutus
Version:
Locutus other languages' standard libraries to JavaScript for fun and educational purposes
24 lines (23 loc) • 925 B
JavaScript
export function nubBy(items, eq) {
// discuss at: https://locutus.io/haskell/list/nubBy/
// original by: Kevin van Zonneveld (https://kvz.io)
// note 1: Keeps the first occurrence of each element using a custom equality predicate, like Haskell Data.List.nubBy.
// example 1: nubBy([1, 2, 2, 3, 1], (a, b) => a === b)
// returns 1: [1, 2, 3]
// example 2: nubBy(['aa', 'ab', 'ba'], (a, b) => a.charAt(0) === b.charAt(0))
// returns 2: ['aa', 'ba']
// example 3: nubBy([], (a, b) => a === b)
// returns 3: []
if (!Array.isArray(items)) {
return [];
}
const equals = typeof eq === 'function' ? eq : (left, right) => Object.is(left, right);
const out = [];
for (const item of items) {
const duplicate = out.some((existing) => equals(item, existing));
if (!duplicate) {
out.push(item);
}
}
return out;
}