⚡ JavaScript

Множества (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();
});

Частые ошибки новичков

  1. Путают Set с массивом. Массив может содержать одинаковые элементы, а Set — нет. Если нужно сохранить порядок и допустить повторы — используй массив. Если нужна уникальность — используй Set.
  2. Пытаются обратиться к элементу по индексу. В Set нет индексов! Нельзя написать mySet[0] — это не сработает. Чтобы получить элемент, используй цикл или преврати Set в массив.
  3. Забывают, что Set удаляет повторы автоматически. Если ты добавляешь одно и то же значение несколько раз, в множестве останется только одна копия. Иногда это неожиданно, но чаще всего — именно то, что нужно.
  4. Путают 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. Они помогут тебе легко управлять уникальными данными — будь то список гостей, ингредиенты для пиццы или контакты в записной книжке!