Множества (Set) в JavaScript (Node.js): подробное руководство
Множества (Set) в JavaScript
Что такое множество и зачем оно нужно?
Представь, что у тебя есть коробка, в которую нельзя положить две одинаковые игрушки. Если ты попытаешься положить туда второй такой же мячик, коробка просто не даст тебе этого сделать — мячик останется в единственном экземпляре. В программировании такая «коробка» называется множеством (Set).
Множество — это коллекция, которая хранит только уникальные значения. Если ты добавишь в него одно и то же число или слово дважды, в множестве останется только одна копия. Это очень удобно, когда нужно избавиться от повторов или проверить, есть ли что-то в списке.
Основной синтаксис
Чтобы создать новое множество, используй конструктор Set():
// Создаём пустое множество
let mySet = new Set();
Можно сразу создать множество с элементами, передав массив в конструктор:
let fruits = new Set(['яблоко', 'банан', 'яблоко', 'апельсин']);
console.log(fruits);
// Выведет: Set(3) { 'яблоко', 'банан', 'апельсин' }
// Обрати внимание: 'яблоко' встречается только один раз!
Основные методы для работы с множеством:
add(value)— добавляет значение в множествоdelete(value)— удаляет значение из множестваhas(value)— проверяет, есть ли значение в множестве (возвращаетtrueилиfalse)size— свойство, показывающее количество элементов в множествеclear()— удаляет все элементы из множества
Вот как это работает в программе:
// Пример: работа с множеством
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
let guests = new Set();
guests.add('Аня');
guests.add('Петя');
guests.add('Аня'); // Аня уже есть, поэтому ничего не изменится
guests.add('Маша');
console.log('Количество гостей:', guests.size); // 3
console.log('Есть ли Петя?', guests.has('Петя')); // true
guests.delete('Петя');
console.log('Есть ли Петя после удаления?', guests.has('Петя')); // false
rl.close();
Как перебрать элементы множества
Множество можно перебрать с помощью цикла for...of:
let colors = new Set(['красный', 'синий', 'зеленый']);
for (let color of colors) {
console.log(color);
}
// Выведет:
// красный
// синий
// зеленый
Также можно превратить множество обратно в массив с помощью Array.from() или spread-оператора [...set]:
let numbers = new Set([1, 2, 3, 2, 1]);
let arr = [...numbers];
console.log(arr); // [1, 2, 3]
Разбор типичных задач
Давай разберём, как решать задачи, похожие на те, что ты будешь делать.
Задача 1: Уникальные ингредиенты пиццы
Пользователь вводит ингредиенты через запятую. Нужно показать только уникальные.
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.question('Введите ингредиенты через запятую: ', (input) => {
// Разделяем строку по запятым и убираем лишние пробелы
let ingredients = input.split(',').map(item => item.trim());
// Создаём множество, чтобы убрать повторы
let uniqueIngredients = new Set(ingredients);
console.log('Уникальные ингредиенты:');
for (let ingredient of uniqueIngredients) {
console.log('- ' + ingredient);
}
rl.close();
});
Задача 2: Объединение списков покупок
У тебя есть свой список и список от друга. Нужно объединить их без повторов.
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
let myList = ['молоко', 'хлеб', 'сыр', 'яблоки'];
let friendList = ['сыр', 'сок', 'печенье', 'молоко'];
// Создаём множество из своего списка
let finalList = new Set(myList);
// Добавляем элементы из списка друга
for (let item of friendList) {
finalList.add(item);
}
console.log('Итоговый список покупок:');
for (let item of finalList) {
console.log('- ' + item);
}
// Выведет: молоко, хлеб, сыр, яблоки, сок, печенье
rl.close();
Задача 3: Удаление лишнего из списка
У тебя есть список продуктов. Некоторые из них ты решил убрать. Нужно удалить их из множества.
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
let shoppingList = new Set(['молоко', 'хлеб', 'сыр', 'яблоки', 'сок']);
rl.question('Какие продукты убрать? (через запятую): ', (input) => {
let toRemove = input.split(',').map(item => item.trim());
for (let item of toRemove) {
shoppingList.delete(item);
}
console.log('Осталось в списке:');
for (let item of shoppingList) {
console.log('- ' + item);
}
rl.close();
});
Частые ошибки новичков
- Путают Set с массивом. Массив может содержать одинаковые элементы, а Set — нет. Если нужно сохранить порядок и допустить повторы — используй массив. Если нужна уникальность — используй Set.
- Пытаются обратиться к элементу по индексу. В Set нет индексов! Нельзя написать
mySet[0]— это не сработает. Чтобы получить элемент, используй цикл или преврати Set в массив. - Забывают, что Set удаляет повторы автоматически. Если ты добавляешь одно и то же значение несколько раз, в множестве останется только одна копия. Иногда это неожиданно, но чаще всего — именно то, что нужно.
- Путают
sizeиlength. У массива есть свойствоlength, а у Set —size. Ошибка:mySet.lengthвернётundefined.
Итоговый пример: Записная книжка контактов
Давай решим задачу, похожую на первую из раздела. Создадим программу, которая хранит имена контактов. Имена должны быть уникальными — нельзя добавить два одинаковых контакта.
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
let contacts = new Set();
function showMenu() {
console.log('\n--- Записная книжка ---');
console.log('1. Добавить контакт');
console.log('2. Показать все контакты');
console.log('3. Удалить контакт');
console.log('4. Выйти');
rl.question('Выберите действие: ', handleChoice);
}
function handleChoice(choice) {
if (choice === '1') {
rl.question('Введите имя контакта: ', (name) => {
if (contacts.has(name)) {
console.log('Такой контакт уже есть!');
} else {
contacts.add(name);
console.log('Контакт добавлен!');
}
showMenu();
});
} else if (choice === '2') {
if (contacts.size === 0) {
console.log('Список контактов пуст.');
} else {
console.log('Ваши контакты:');
for (let contact of contacts) {
console.log('- ' + contact);
}
}
showMenu();
} else if (choice === '3') {
rl.question('Введите имя для удаления: ', (name) => {
if (contacts.delete(name)) {
console.log('Контакт удалён!');
} else {
console.log('Такого контакта нет.');
}
showMenu();
});
} else if (choice === '4') {
console.log('До свидания!');
rl.close();
} else {
console.log('Неверный выбор. Попробуйте снова.');
showMenu();
}
}
showMenu();
В этой программе мы используем все основные возможности Set:
add()— добавляем контактhas()— проверяем, есть ли уже такой контактdelete()— удаляем контактsize— проверяем, пуст ли список- Цикл
for...of— выводим все контакты
Теперь ты знаешь, как работать с множествами в JavaScript. Они помогут тебе легко управлять уникальными данными — будь то список гостей, ингредиенты для пиццы или контакты в записной книжке!