Давным-давно в JavaScript эмулировали множества (коллекции, в которых элемент может входить только один раз, то есть без дублирующихся элементов) с помощью названий полей:
1 2 3 4 5 6 7 8 9 |
var setEmulation = {}; // Присвоение элементов setEmulation['Vasya'] = true; setEmulation['Oksana'] = true; // Проверка вхождения console.log(setEmulation['Vasya']); // true console.log(setEmulation['missingElement']); // false |
Однако сейчас существует специальный класс Set:
1 2 3 4 5 6 |
const names = new Set(); names.add("Vasya"); names.add("Oksana"); console.log(names.has("Vasya")); // true console.log(names.has("Missing_name")); // false |
Существует метод для получения итератора, с помощью которого можно пройтись по всем значениям в множестве:
1 2 3 4 5 6 |
console.log(names.keys()); // VM603:1 SetIterator {'Vasya', 'Oksana'} console.log(names.values()); // VM707:1 SetIterator {'Vasya', 'Oksana'} |
Метод keys просто другое название метода values, по факту это один и тот же метод.
Метод clear позволяет очистить множество:
1 |
names.clear(); |
Можно перебрать все элементы, входящие во множество с помощью метода forEach:
1 2 3 |
names.forEach((value) => { console.log("value: " + value); }); |
Код выше выведет в консоль:
1 2 |
value: Vasya value: Oksana |
Тут забыто сказать, что в Set поддерживает не только строки.
Документация гласит.
The Set object lets you store unique values of any type, whether primitive values or object references.
const s = new Set();
s.add(1);
s.add(‘1’);
// Symbol
const symbol = Symbol(‘1’);
s.add(symbol)
s.has(symbol); // true
s.has(Symbol(‘1’)); // false
// Global Symbol
s.add(Symbol.for(‘1’));
s.has(Symbol.for(‘1’)); // true
const strObj = new String(‘1’);
s.add(strObj)
s.has(strObj); // true
s.has(new String(‘1’)); // false
// Array
const array = [1,2];
s.add(array);
s.has(array); // true
s.has([1,2]); // false