Вот несколько способов отфильтровать уникальные значения в javascript.

1. Использование набора:

Set — это новая структура данных, представленная в ES6. Он чем-то похож на массив, но не позволяет хранить повторяющиеся значения.

Чтобы отфильтровать уникальные значения, мы передаем массив конструктору Set и формируем массив из объекта Set с помощью метода
Array.from.

Set прекрасно работает со строковыми и числовыми типами. А вот с объектами не получится почему? 🤔

Взгляните на этот пример:

Даже несмотря на то, что Томми и Люси дублируются. Сету не удалось идентифицировать их как дубликаты.

Взгляните на другой пример:

Это происходит потому, что при сравнении объектов они сравниваются по ссылке, а не по значению. Вот почему, когда сначала добавляются lucy и tommy, они не добавляются, потому что имеют одну и ту же ссылку. Но когда я добавил значение tommy напрямую, это создало бы новую ссылку.

2. Использование фильтра/уменьшения:

Мы также можем использовать Array.reduce для достижения такого же результата.

Здесь идея заключается в том, что метод findIndex или indexOf возвращает индекс первого элемента, соответствующего критериям. Поэтому, если индекс filter не равен индексу, возвращаемому findIndex, то элемент является дубликатом.

Этот тип будет работать для всех типов, но для каждого элемента в массиве нам придется снова перебирать массив. Представьте, где вы хотите отфильтровать тысячи записей. Этот подход не является эффективным O (n²).

3. Пометить подход:

Это мой любимый способ поиска уникальности, особенно при работе с большим массивом объектов. Мы пройдемся по массиву и в объекте флага проверим, присутствует ли уже значение. Если нет, мы добавим значение в объект флага и поместим его в массив, иначе просто проигнорируем его. В этом случае мы пройдемся по массиву только один раз, поэтому временная сложность будет равна O(n).

Какой ваш любимый способ и почему? Дайте нам знать об этом в комментариях.