Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Set — встроенный объект в JavaScript, который хранит коллекцию уникальных значений. Это один из фундаментальных типов данных, очень полезный для бэкенд-разработки на Node.js.
Основные характеристики
Set хранит только уникальные значения. Если попытаться добавить дубликат, он не будет добавлен.
const set = new Set();
set.add(1);
set.add(1);
set.add(2);
set.add('hello');
console.log(set.size); // 3 (не 4!)
console.log(set); // Set(3) { 1, 2, 'hello' }
Основные методы
add(value) — добавляет значение в Set has(value) — проверяет наличие значения delete(value) — удаляет значение clear() — очищает весь Set size — свойство, возвращает количество элементов
const users = new Set();
users.add('alice');
users.add('bob');
users.add('alice'); // дубликат, не добавится
console.log(users.has('alice')); // true
console.log(users.size); // 2
users.delete('bob');
console.log(users.size); // 1
Итерация по Set
const colors = new Set(['red', 'green', 'blue']);
// for...of
for (const color of colors) {
console.log(color);
}
// forEach
colors.forEach(color => {
console.log(color);
});
// Перевести в массив
const colorArray = Array.from(colors);
const colorArray2 = [...colors];
Реальные примеры в Node.js
1. Удаление дубликатов из массива:
const numbers = [1, 2, 2, 3, 3, 4, 4, 5];
const unique = [...new Set(numbers)];
console.log(unique); // [1, 2, 3, 4, 5]
2. Отслеживание активных соединений:
const activeConnections = new Set();
function addConnection(userId) {
activeConnections.add(userId);
console.log(`Active connections: ${activeConnections.size}`);
}
function removeConnection(userId) {
activeConnections.delete(userId);
}
addConnection('user1');
addConnection('user2');
addConnection('user1'); // не добавится
console.log(activeConnections.size); // 2
3. Отслеживание посещённых страниц:
const visitedPages = new Set();
visitedPages.add('/home');
visitedPages.add('/products');
visitedPages.add('/home'); // не добавится
if (visitedPages.has('/products')) {
console.log('User visited products page');
}
4. Кэширование результатов:
const processedIds = new Set();
async function processUser(userId) {
if (processedIds.has(userId)) {
console.log('Already processed');
return;
}
// Обработка
processedIds.add(userId);
}
Set vs Array vs Object
Сравнение для проверки наличия элемента:
// Array — O(n), медленно
const arr = [1, 2, 3, 4, 5];
arr.includes(3); // O(n)
// Set — O(1), очень быстро
const set = new Set([1, 2, 3, 4, 5]);
set.has(3); // O(1)
// Object — O(1), но только для строковых ключей
const obj = { '1': true, '2': true, '3': true };
'1' in obj; // O(1)
При больших объёмах данных Set значительно быстрее:
const arr = Array.from({length: 100000}, (_, i) => i);
const set = new Set(arr);
console.time('Array includes');
for (let i = 0; i < 1000; i++) {
arr.includes(50000);
}
console.timeEnd('Array includes'); // ~50ms
console.time('Set has');
for (let i = 0; i < 1000; i++) {
set.has(50000);
}
console.timeEnd('Set has'); // ~0.1ms
WeakSet
Для хранения объектов используют WeakSet — он удаляет элементы когда на них нет ссылок (для garbage collection).
const weakSet = new WeakSet();
let user1 = { name: 'Alice' };
let user2 = { name: 'Bob' };
weakSet.add(user1);
weakSet.add(user2);
user1 = null; // объект может быть удален из памяти
Когда использовать Set
- Уникальные значения (удаление дубликатов)
- Проверка наличия элемента (has быстрее чем includes)
- Отслеживание активных сессий/соединений
- Кэширование и мемоизация
- Набор тегов или категорий
- Любые операции с уникальными данными
Set — это мощный инструмент для эффективного управления коллекциями в JavaScript. Используй его когда нужны уникальные значения и быстрая проверка наличия элемента.