Проверяет понимание особенностей сравнения объектов в JavaScript и почему Set не может корректно дедуплицировать массивы объектов.
Set в JavaScript использует алгоритм сравнения, основанный на строгом равенстве (===). Для примитивных типов (числа, строки, булевы значения) это работает отлично: два одинаковых числа считаются равными. Однако для объектов сравнение происходит по ссылке, а не по содержимому. Два объекта, даже с идентичными свойствами, считаются разными, если они не ссылаются на один и тот же экземпляр в памяти.
const obj1 = { id: 1, name: 'Alice' };
const obj2 = { id: 1, name: 'Alice' };
const set = new Set([obj1, obj2]);
console.log(set.size); // 2, хотя объекты выглядят одинаковоВ этом примере obj1 и obj2 — разные объекты, поэтому Set считает их уникальными. Даже если добавить один и тот же объект дважды, Set корректно удалит дубликат, но только если это одна и та же ссылка.
Для дедупликации массива объектов нужно использовать другие подходы:
const arr = [{ id: 1 }, { id: 2 }, { id: 1 }];
const map = new Map(arr.map(obj => [obj.id, obj]));
const unique = [...map.values()];
console.log(unique); // [{ id: 1 }, { id: 2 }]Здесь мы используем id как уникальный ключ. Если объекты не имеют уникального поля, можно сериализовать их в строку.
Set не подходит для дедупликации объектов из-за сравнения по ссылке. Для этой задачи используйте Map с кастомным ключом или функции, которые сравнивают содержимое объектов. Это особенно важно при работе с данными из API или базы данных, где объекты могут быть идентичны по значению, но различны по ссылке.
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию