HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-26
1 <p>Множество хоть и не используется так же широко, как массивы, но при этом в некоторых ситуациях являются очень полезными структурами данных. В этом уроке мы рассмотрим тип и структуру данных Set, который является реализацией математической структуры "множество".</p>
1 <p>Множество хоть и не используется так же широко, как массивы, но при этом в некоторых ситуациях являются очень полезными структурами данных. В этом уроке мы рассмотрим тип и структуру данных Set, который является реализацией математической структуры "множество".</p>
2 <h2>Фильтрация</h2>
2 <h2>Фильтрация</h2>
3 <p>Предположим, что у нас есть один массив, в котором мы описываем стоп-слова. Это те слова, которые не должны попасть в выходной поток. Также есть массив с набором слов:</p>
3 <p>Предположим, что у нас есть один массив, в котором мы описываем стоп-слова. Это те слова, которые не должны попасть в выходной поток. Также есть массив с набором слов:</p>
4 <p>Если посмотреть глубже на этот код, то можно увидеть одну небольшую проблему. Она в определенных ситуациях может иметь значение.</p>
4 <p>Если посмотреть глубже на этот код, то можно увидеть одну небольшую проблему. Она в определенных ситуациях может иметь значение.</p>
5 <p>includes проверяет вхождение полным перебором массива. В итоге на каждой итерации filter будет срабатывать перебор массива stopWords.</p>
5 <p>includes проверяет вхождение полным перебором массива. В итоге на каждой итерации filter будет срабатывать перебор массива stopWords.</p>
6 <p>В этом простом коде не возникнет проблем. Но в работе с большими объемами данных происходит большой процессинг. И это начинает иметь значение. Тогда придется как-то изменить массив на что-то другое, чтобы нам было удобно проверять вхождение. И для этого есть несколько способов:</p>
6 <p>В этом простом коде не возникнет проблем. Но в работе с большими объемами данных происходит большой процессинг. И это начинает иметь значение. Тогда придется как-то изменить массив на что-то другое, чтобы нам было удобно проверять вхождение. И для этого есть несколько способов:</p>
7 <ul><li>С использованием Map</li>
7 <ul><li>С использованием Map</li>
8 <li>С использованием Set</li>
8 <li>С использованием Set</li>
9 </ul><p>Разберем их подробнее.</p>
9 </ul><p>Разберем их подробнее.</p>
10 <h3>С использованием Map</h3>
10 <h3>С использованием Map</h3>
11 <p>Переделаем массив в Map, в котором ключ - это слово, а значение - это просто true:</p>
11 <p>Переделаем массив в Map, в котором ключ - это слово, а значение - это просто true:</p>
12 <p>Здесь мы по сути используем объект JavaScript. В данном случае большой разницы нет. Остальное практически то же самое, только проверяем, входит ли значение в stopWords с помощью !stopWords [word]. И если у нас возвращается undefined, то отрицание возвращает нам истину, и слово туда не попадает.</p>
12 <p>Здесь мы по сути используем объект JavaScript. В данном случае большой разницы нет. Остальное практически то же самое, только проверяем, входит ли значение в stopWords с помощью !stopWords [word]. И если у нас возвращается undefined, то отрицание возвращает нам истину, и слово туда не попадает.</p>
13 <p>Но есть еще один гораздо более интересный способ.</p>
13 <p>Но есть еще один гораздо более интересный способ.</p>
14 <h3>С использованием Set</h3>
14 <h3>С использованием Set</h3>
15 <p>По сути, в предыдущем примере мы использовали Map, как способ имитировать Set, то есть множество. Причем в нашем случае это множество неповторяющихся элементов.</p>
15 <p>По сути, в предыдущем примере мы использовали Map, как способ имитировать Set, то есть множество. Причем в нашем случае это множество неповторяющихся элементов.</p>
16 <p>И в JavaScript есть для этого специальный тип. Он работает практически так же, как и Map:</p>
16 <p>И в JavaScript есть для этого специальный тип. Он работает практически так же, как и Map:</p>
17 <p>Здесь мы пишем new Set() и передаем в него массив. После этого формируется некоторая структура, в которой внутри эффективным образом разложены все элементы этого массива. Поэтому проверка на вхождение во множество не требует перебора всех элементов.</p>
17 <p>Здесь мы пишем new Set() и передаем в него массив. После этого формируется некоторая структура, в которой внутри эффективным образом разложены все элементы этого массива. Поэтому проверка на вхождение во множество не требует перебора всех элементов.</p>
18 <p>На самом деле мы этого наверняка не знаем. Но обычно языки программирования делают множество с той целью, чтобы было очень легко и удобно проверять вхождение в этом множестве.</p>
18 <p>На самом деле мы этого наверняка не знаем. Но обычно языки программирования делают множество с той целью, чтобы было очень легко и удобно проверять вхождение в этом множестве.</p>
19 <p>В итоге программа меняется в двух местах: в определении множества и в проверке через метод has(). Это интерфейсный метод объекта, который у нас получился после new Set(). В нем мы передаем слово, и делается очень быстрая проверка. В итоге мы получаем такой же результат, как и в предыдущих способах.</p>
19 <p>В итоге программа меняется в двух местах: в определении множества и в проверке через метод has(). Это интерфейсный метод объекта, который у нас получился после new Set(). В нем мы передаем слово, и делается очень быстрая проверка. В итоге мы получаем такой же результат, как и в предыдущих способах.</p>
20 <h2>Интерфейс Set</h2>
20 <h2>Интерфейс Set</h2>
21 <p>Интерфейс у Set очень простой. Он принимает в конструкторе массив, который внутри себя раскладывает и сохраняет:</p>
21 <p>Интерфейс у Set очень простой. Он принимает в конструкторе массив, который внутри себя раскладывает и сохраняет:</p>
22 <p>При этом у него есть возможность устанавливать и изменять массив в момент работы с ним:</p>
22 <p>При этом у него есть возможность устанавливать и изменять массив в момент работы с ним:</p>
23 <p>Здесь используется метод add() для добавления элемента.</p>
23 <p>Здесь используется метод add() для добавления элемента.</p>
24 <p>Также у нас есть свойство size, которое позволяет проверить размер множества:</p>
24 <p>Также у нас есть свойство size, которое позволяет проверить размер множества:</p>
25 <p>Еще есть метод has(), который позволяет узнать, лежит ли что-то внутри или нет:</p>
25 <p>Еще есть метод has(), который позволяет узнать, лежит ли что-то внутри или нет:</p>
26 <p>И есть delete() для удаления. Метод принимает значение элемента, который нужно удалить:</p>
26 <p>И есть delete() для удаления. Метод принимает значение элемента, который нужно удалить:</p>
27 <h2>Обход</h2>
27 <h2>Обход</h2>
28 <p>Set не является массивом, но его можно преобразовать в массив, используя такой подход:</p>
28 <p>Set не является массивом, но его можно преобразовать в массив, используя такой подход:</p>
29 <p>Здесь мы используем Array.from и передаем в него Set. На выходе у нас появляется массив.</p>
29 <p>Здесь мы используем Array.from и передаем в него Set. На выходе у нас появляется массив.</p>
30 <p>Если мы передаем в конструктор Set массив, в котором повторяются элементы, то при формировании коллекции мы получаем уникальные элементы. Это простой способ найти уникальные значения в массиве. Это говорит о том, что Set действительно эффективно раскладывает массивы на уникальные значения.</p>
30 <p>Если мы передаем в конструктор Set массив, в котором повторяются элементы, то при формировании коллекции мы получаем уникальные элементы. Это простой способ найти уникальные значения в массиве. Это говорит о том, что Set действительно эффективно раскладывает массивы на уникальные значения.</p>
31 <p>Чтобы поработать с Set и обойти его, мы можем использовать следующие методы:</p>
31 <p>Чтобы поработать с Set и обойти его, мы можем использовать следующие методы:</p>
32 <h2>Выводы</h2>
32 <h2>Выводы</h2>
33 <p>В этом уроке мы рассмотрели тип и структуру данных Set, который является реализацией математической структуры "множество". Его интерфейс очень простой. Он принимает массив и раскладывает его на уникальные значения. Также у него есть возможность устанавливать и изменять массив в момент работы с ним, проверять размер элементов и узнавать, лежит ли что-то внутри.</p>
33 <p>В этом уроке мы рассмотрели тип и структуру данных Set, который является реализацией математической структуры "множество". Его интерфейс очень простой. Он принимает массив и раскладывает его на уникальные значения. Также у него есть возможность устанавливать и изменять массив в момент работы с ним, проверять размер элементов и узнавать, лежит ли что-то внутри.</p>