Set - колекція унікальних значень. Повторне додавання того самого значення нічого не змінює.
const tags = new Set(['php', 'laravel', 'php']);
tags.size; // 2
tags.add('vue');
tags.has('laravel'); // true, за O(1)
tags.delete('php');
[...tags]; // ['laravel', 'vue'] - порядок додавання зберігається
Найчастіший прийом - прибрати дублікати:
const unique = [...new Set(ids)];
Унікальність визначається як === (з винятком: NaN дорівнює NaN). Тому об'єкти порівнюються за посиланням - два різні об'єкти { id: 1 } обидва потраплять у множину. Для унікальності об'єктів за полем використовують Map з ключем-полем.
Методи множин (ES2025) - нарешті вбудовані операції теорії множин. Кожен повертає новий Set:
const a = new Set([1, 2, 3]);
const b = new Set([2, 3, 4]);
a.union(b); // {1, 2, 3, 4}
a.intersection(b); // {2, 3}
a.difference(b); // {1} - є в a, немає в b
a.symmetricDifference(b); // {1, 4} - є лише в одній з множин
new Set([2]).isSubsetOf(a); // true
a.isSupersetOf(new Set([1])); // true
a.isDisjointFrom(new Set([9])); // true - спільних елементів немає
Практичні застосування:
- синхронізація зв'язків: які теги додати й які прибрати при збереженні форми:
const toAttach = selected.difference(current);
const toDetach = current.difference(selected);
Це те, що в Laravel робить sync() для зв'язків «багато-до-багатьох».
- права:
required.isSubsetOf(userPermissions)- чи має користувач усі потрібні права; - швидкі перевірки належності у фільтрах замість
array.includesу циклі.
Аргументом нових методів може бути не лише Set, а будь-який об'єкт із size, has() і keys() - наприклад, Map (порівнюються ключі). Масив напряму не підходить: a.union([4]) кине помилку, потрібно a.union(new Set([4])).
Підтримка: усі сучасні браузери з 2024 року, Node.js 22+.