Поиск…
Вступление
Объект Set позволяет хранить уникальные значения любого типа, будь то примитивные значения или ссылки на объекты.
Установить объекты - это коллекции значений. Вы можете перебирать элементы набора в порядке размещения. Значение в наборе может появляться только один раз ; он уникален в коллекции Set. Отдельные значения различаются с использованием алгоритма сравнения SameValueZero .
Синтаксис
- новый Set ([iterable])
- mySet.add (значение)
- mySet.clear ()
- mySet.delete (значение)
- mySet.entries ()
- mySet.forEach (callback [, thisArg])
- mySet.has (значение)
- mySet.values ()
параметры
| параметр | подробности | 
|---|---|
| итерируемый | Если итерируемый объект передан, все его элементы будут добавлены в новый Set. null считается неопределенным. | 
| значение | Значение элемента, добавляемого в объект Set. | 
| Перезвоните | Функция для выполнения для каждого элемента. | 
| thisArg | Необязательный. Значение, которое необходимо использовать при выполнении обратного вызова. | 
замечания
Поскольку каждое значение в наборе должно быть уникальным, будет определено равенство значения и не будет основано на том же алгоритме, что и тот, который используется в операторе ===. В частности, для Sets +0 (который строго равен -0) и -0 - разные значения. Однако это было изменено в последней спецификации ECMAScript 6. Начиная с Gecko 29.0 (Firefox 29 / Thunderbird 29 / SeaMonkey 2.26) (ошибка 952870), а последние ночные Chrome, +0 и -0 рассматриваются как одно и то же значение в объектах Set. Кроме того, NaN и undefined также могут быть сохранены в наборе. NaN считается таким же, как NaN (хотя NaN! == NaN).
Создание набора
Объект Set позволяет хранить уникальные значения любого типа, будь то примитивные значения или ссылки на объекты.
Вы можете вставлять элементы в набор и перебирать их аналогично простому массиву JavaScript, но в отличие от массива вы не можете добавить значение в Set, если значение уже существует в нем.
Чтобы создать новый набор:
const mySet = new Set();
Или вы можете создать набор из любого итерабельного объекта, чтобы дать ему начальные значения:
const arr = [1,2,3,4,4,5];
const mySet = new Set(arr);
 В приведенном выше примере заданное содержимое будет {1, 2, 3, 4, 5} . Обратите внимание, что значение 4 появляется только один раз, в отличие от исходного массива, используемого для его создания. 
Добавление значения в набор
 Чтобы добавить значение в Set, используйте метод .add() : 
mySet.add(5);
Если значение уже существует в наборе, оно не будет добавлено снова, так как Sets содержит уникальные значения.
 Обратите внимание, что метод .add() возвращает сам набор, поэтому вы можете цепью добавлять вызовы вместе: 
mySet.add(1).add(2).add(3);
Удаление значения из набора
 Чтобы удалить значение из набора, используйте .delete() : 
mySet.delete(some_val);
 Эта функция вернет true если значение существует в наборе и было удалено, или false противном случае. 
Проверка наличия значения в наборе
 Чтобы проверить, существует ли заданное значение в наборе, используйте .has() : 
mySet.has(someVal);
 someVal true если в someVal появится someVal , иначе false . 
Очистка набора
 Вы можете удалить все элементы в наборе с помощью .clear() : 
mySet.clear();
Получение заданной длины
 Вы можете получить количество элементов внутри набора, используя свойство .size 
const mySet = new Set([1, 2, 2, 3]);
mySet.add(4);
mySet.size; // 4
 Это свойство, в отличие от Array.prototype.length , Array.prototype.length только для чтения, что означает, что вы не можете его изменить, назначив ему что-то: 
mySet.size = 5;
mySet.size; // 4
В строгом режиме он даже выдает ошибку:
TypeError: Cannot set property size of #<Set> which has only a getter
Преобразование наборов в массивы
 Иногда вам может понадобиться , чтобы преобразовать набор в массив, например , чтобы иметь возможность использовать Array.prototype методы , как .filter() . Для этого используйте Array.from() или destructuring-assignment Array.from() : 
var mySet = new Set([1, 2, 3, 4]);
//use Array.from
const myArray = Array.from(mySet);
//use destructuring-assignment
const myArray = [...mySet];
Теперь вы можете отфильтровать массив, чтобы содержать только четные числа и преобразовать его обратно в Set using Set constructor:
mySet = new Set(myArray.filter(x => x % 2 === 0));
 mySet теперь содержит только четные числа: 
console.log(mySet); // Set {2, 4}
Пересечение и различие в наборах
Нет встроенных методов для пересечения и разницы в наборах, но вы все еще можете достичь этого, но преобразовывая их в массивы, фильтруя и конвертируя обратно в Sets:
var set1 = new Set([1, 2, 3, 4]),
    set2 = new Set([3, 4, 5, 6]);
const intersection = new Set(Array.from(set1).filter(x => set2.has(x)));//Set {3, 4}
const difference = new Set(Array.from(set1).filter(x => !set2.has(x))); //Set {1, 2}
Итерационные наборы
Вы можете использовать простой цикл for для циклического набора Set:
const mySet = new Set([1, 2, 3]);
for (const value of mySet) {
  console.log(value); // logs 1, 2 and 3
}
При повторении по набору он всегда возвращает значения в том порядке, в котором они были сначала добавлены в набор. Например:
const set = new Set([4, 5, 6])
set.add(10)
set.add(5) //5 already exists in the set
Array.from(set) //[4, 5, 6, 10]
 Также существует .forEach() , аналогичный Array.prototype.forEach() . Он имеет два параметра, callback , который будет выполняться для каждого элемента, и необязательный thisArg , который будет использоваться как this при выполнении callback . 
 callback имеет три аргумента. Первые два аргумента являются и текущим элементом Set (для согласованности с Array.prototype.forEach() и Map.prototype.forEach() ), а третьим аргументом является сам Set. 
mySet.forEach((value, value2, set) => console.log(value)); // logs 1, 2 and 3