Поиск…
Вступление
Объект 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