Как убрать повторяющиеся объекты по полю
Короткий ответ
Оставьте первый объект с каждым значением поля, запоминая увиденные значения в Set:
const users = [
{ id: 1, name: 'Anna' },
{ id: 2, name: 'Oleg' },
{ id: 1, name: 'Anna (copy)' },
];
const seen = new Set();
const unique = users.filter((user) => {
if (seen.has(user.id)) return false;
seen.add(user.id);
return true;
});
console.log(unique.map((user) => user.name).join(', '));Результат:
Anna, OlegОставить последний
Map с полем в качестве ключа перезаписывает ранние объекты, и остаётся последний:
const users = [
{ id: 1, name: 'Anna' },
{ id: 2, name: 'Oleg' },
{ id: 1, name: 'Anna (updated)' },
];
const unique = [...new Map(users.map((user) => [user.id, user])).values()];
console.log(unique.map((user) => user.name).join(', '));Результат:
Anna (updated), OlegЧастая ошибка
new Set() напрямую с объектами не поможет: он сравнивает их по ссылке, а разные объекты всегда разные:
const users = [{ id: 1 }, { id: 1 }];
console.log(new Set(users).size);Результат:
2Функции из этого ответа
- Map — Коллекция пар ключ — значение, где ключом может быть что угодно.
- Array.prototype.filter — Создаёт новый массив из элементов, прошедших проверку.
- Set — Коллекция уникальных значений.