Это универсальное решение, которое использует сокращение, позволяет отображать и поддерживает порядок вставки.
items : массив
mapper : Унарная функция, которая отображает элемент в критерии, или пустая для отображения самого элемента.
function distinct(items, mapper) {
if (!mapper) mapper = (item)=>item;
return items.map(mapper).reduce((acc, item) => {
if (acc.indexOf(item) === -1) acc.push(item);
return acc;
}, []);
}
Использование
const distinctLastNames = distinct(items, (item)=>item.lastName);
const distinctItems = distinct(items);
Вы можете добавить это в свой Array prototype и оставить параметр items , если это ваш стиль ...
const distinctLastNames = items.distinct( (item)=>item.lastName) ) ;
const distinctItems = items.distinct() ;
Вы также можете использовать набор вместо массива для ускорения сопоставления.
function distinct(items, mapper) {
if (!mapper) mapper = (item)=>item;
return items.map(mapper).reduce((acc, item) => {
acc.add(item);
return acc;
}, new Set());
}