Поиск…


Вступление

Объект 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


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow