Set - простыми словами, это особый вид коллекций по типу массива, но в котором каждое значение может повторяться только один раз. Короче: это массив, в котором каждое значение встречается только однажды.
Допустим, есть массив данных, в котором часть чисел повторяется:
Код
const arr = [1, 1, 2, 2, 4, 5, 6, 5];
Сформируем из него новый сет:
Код
const arr = [1, 1, 2, 2, 4, 5, 6, 5];
const set = new Set(arr);
console.log(set);
Цитата
Set(5) { 1, 2, 4, 5, 6 }
Как видно, все значения теперь стали уникальны и встречаются только один раз.
Допустим, из какой-то базы данных поступил список студентов группы:
Код
const arr = ['Alex', 'Ann', 'Oleg', 'Alex'];
Делаем из этого массива также новый сет, чтобы убедиться, что со строками всё сработает также как и с числами:
Код
const arr = ['Alex', 'Ann', 'Oleg', 'Alex'];
const set = new Set(arr);
console.log(set);
Цитата
Set(3) { 'Alex', 'Ann', 'Oleg' }
У
Set также есть свои методы.
Метод add() - в аргументы добавляются какие-то данные, которые должны прийти в набор.
Код
const arr = ['Alex', 'Ann', 'Oleg', 'Alex'];
const set = new Set(arr);
set.add('Ivan');
console.log(set);
Цитата
Set(4) { 'Alex', 'Ann', 'Oleg', 'Ivan' }
Но если мы попробуем добавить значение, которое уже есть в наборе, ничего не произойдет:
Цитата
Set(4) { 'Alex', 'Ann', 'Oleg', 'Ivan' }
После того как отработает, метод
add() возвращает сам набор,что позволяет нам использовать цепочку операций:
Код
set.add('Ivan').add('Mikle');
console.log(set);
Цитата
Set(5) { 'Alex', 'Ann', 'Oleg', 'Ivan', 'Mikle' }
Подобный функционал можно реализовать и в обычном массиве, предварительно проходя по всему массиву в поисках конкретного значения, и если его не находим, то добавляем через
push().
В поиске по массиву может помочь метод
find() Метод find() экземпляров Array возвращает первый элемент в указанном массиве, который удовлетворяет указанной функции проверки. Если ни одно значение не удовлетворяет функции проверки, возвращается undefined .
И всё же, с помощью
set всё это будет реализовано быстрее и более оптимизированно.
Удалить какой-либо элемент из набора:
Проверить, входит ли какой-то элемент в набор:
Полностью очистить набор:
Узнать размер нашего набора данных:
Мы можем перебирать наш набор данных, есть два варианта: с помощью
for...of и с помощью
forEach() Код
for (let value of set) console.log(value);
Цитата
Alex
Ann
Oleg
Ivan
Mikle
Вариант с
forEach() Код
set.forEach((value, valueAgaing, set) => {
console.log(value, valueAgaing);
});
Второй аргумент
valueAgaing это тот же
value, сделано это для того, чтобы была совместимость.
Цитата
Alex Alex
Ann Ann
Oleg Oleg
Ivan Ivan
Mikle Mikle
Set также имеет встроенные методы:
set.values(); - возвращает новый объект итератора, который содержит все значения из набора. Порядок значений — в том же порядке, в котором они были добавлены в набор.
Код
console.log(set.values());
Цитата
[Set Iterator] { 'Alex', 'Ann', 'Oleg', 'Ivan', 'Mikle' }
set.keys() - метод для обратной совместимости с
map(), возвращает объект итератора со значениями в наборе. Поскольку у набора нет ключей, метод
keys() возвращает то же, что и
values().
Код
console.log(set.keys());
Цитата
[Set Iterator] { 'Alex', 'Ann', 'Oleg', 'Ivan', 'Mikle' }
set.entries() - возвращает итератор, который позволяет обходить значения коллекции
Set в виде пар
[значение, значение]. Метод должен возвращать пару
[ключ, значение] из объекта, но поскольку у набора нет ключей, возвращает
[value, value]. Это делает наборы совместимыми с картами.
Код
console.log(set.entries());
Цитата
[Set Entries] {
[ 'Alex', 'Alex' ],
[ 'Ann', 'Ann' ],
[ 'Oleg', 'Oleg' ],
[ 'Ivan', 'Ivan' ],
[ 'Mikle', 'Mikle' ]
}
Из практического применения
Set, часто реализуется функция-помощник для фильтрации любого массива.
Смысл работы такой функции: массив превращается в
Set, в нём мы избавляемся от дублей, а потом из набора формируем новый массив из этих отобранных уникальных значений. Формируем его с помощью команды
Array.from() Код
const arr = ['Alex', 'Ann', 'Oleg', 'Alex'];
function unique(arr) {
return Array.from(new Set(arr));
}
console.log(unique(arr));
Цитата
[ 'Alex', 'Ann', 'Oleg' ]
Всего комментариев: 0