Вот несколько способов отфильтровать уникальные значения в javascript.
1. Использование набора:
Set — это новая структура данных, представленная в ES6. Он чем-то похож на массив, но не позволяет хранить повторяющиеся значения.
Чтобы отфильтровать уникальные значения, мы передаем массив конструктору Set
и формируем массив из объекта Set с помощью методаArray.from
.
Set прекрасно работает со строковыми и числовыми типами. А вот с объектами не получится почему? 🤔
Взгляните на этот пример:
Даже несмотря на то, что Томми и Люси дублируются. Сету не удалось идентифицировать их как дубликаты.
Взгляните на другой пример:
Это происходит потому, что при сравнении объектов они сравниваются по ссылке, а не по значению. Вот почему, когда сначала добавляются lucy и tommy, они не добавляются, потому что имеют одну и ту же ссылку. Но когда я добавил значение tommy напрямую, это создало бы новую ссылку.
2. Использование фильтра/уменьшения:
Мы также можем использовать Array.reduce
для достижения такого же результата.
Здесь идея заключается в том, что метод findIndex
или indexOf
возвращает индекс первого элемента, соответствующего критериям. Поэтому, если индекс filter
не равен индексу, возвращаемому findIndex
, то элемент является дубликатом.
Этот тип будет работать для всех типов, но для каждого элемента в массиве нам придется снова перебирать массив. Представьте, где вы хотите отфильтровать тысячи записей. Этот подход не является эффективным O (n²).
3. Пометить подход:
Это мой любимый способ поиска уникальности, особенно при работе с большим массивом объектов. Мы пройдемся по массиву и в объекте флага проверим, присутствует ли уже значение. Если нет, мы добавим значение в объект флага и поместим его в массив, иначе просто проигнорируем его. В этом случае мы пройдемся по массиву только один раз, поэтому временная сложность будет равна O(n).
Какой ваш любимый способ и почему? Дайте нам знать об этом в комментариях.