Сводка

Объекты Set позволяют вам сохранять уникальные значения любого типа, как примитивы, так и другие типы объектов.

Синтаксис

 new Set([iterable]);

Параметры

iterable
При передаче итерируемого объекта, все его элементы будут добавлены в новый Set. Иначе (или при null) новый Set будет пуст.

Возвращает

Новый Set объект.

Описание

Объекты Set представляют коллекции значений, по которым вы можете выполнить обход в порядке вставки элементов. Значение элемента в Set может присутствовать только в одном экземпляре, что обеспечивает его уникальность в коллекции Set.

Сравнение значений

Поскольку каждое значение в Set должно быть уникальным, сравнение значений основано на алгоритме "подобное значение": NaN равно NaN (несмотря на то, что NaN !== NaN); все другие значения рассматриваются равными исходя из семантики оператора строго равенства ===. В ранних версиях черновика ECMAScript 6 -0 и +0 считались разными (несмотря на то, что -0 === +0), это было изменено в последующих версиях и адаптировано в Gecko 29 (Firefox 29 / Thunderbird 29 / SeaMonkey 2.26) (баг 952870) и последней ночной сборке ChromeNaN и undefined также могут сохраняться в Set.

Свойства

Set.length
Значение свойства length всегда равно 0.
Чтобы узнать количество элементов в Set, используйте Set.prototype.size.
get Set[@@species]
Функция-конструктор, которая используется для создания производных объектов.
Set.prototype
Представляет прототип конструктора Set. Позволяет добавлять свойства всем объектам типа Set.

Экземпляры Set

Все экземпляры Set унаследованы от Set.prototype.

Свойства

Set.prototype.constructor
Returns the function that created an instance's prototype. This is the Set function by default.
Set.prototype.size
Returns the number of values in the Set object.

Методы

Set.prototype.add(value)
Appends a new element with the given value to the Set object. Returns the Set object.
Set.prototype.clear()
Removes all elements from the Set object.
Set.prototype.delete(value)
Removes the element associated to the value and returns the value that Set.prototype.has(value) would have previously returned. Set.prototype.has(value) will return false afterwards.
Set.prototype.entries()
Returns a new Iterator object that contains an array of [key, value] for each element in the Set object, in insertion order. This is kept similar to the Map object, so that each entry has the same value for its key and value here.
Set.prototype.forEach(callbackFn[, thisArg])
Calls callbackFn once for each value present in the Set object, in insertion order. If a thisArg parameter is provided to forEach, it will be used as the this value for each callback.
Set.prototype.has(value)
Returns a boolean asserting whether an element is present with the given value in the Set object or not.
Set.prototype.keys()
Is the same function as the values() function and returns a new Iterator object that contains the values for each element in the Set object in insertion order.
Set.prototype.values()
Returns a new Iterator object that contains the values for each element in the Set object in insertion order.
Set.prototype[@@iterator]()
Returns a new Iterator object that contains the values for each element in the Set object in insertion order.

Примеры

Использование объекта Set

var mySet = new Set();

mySet.add(1); // Set { 1 }
mySet.add(5); // Set { 1, 5 }
mySet.add(5); // Set { 1, 5 }
mySet.add("some text"); // Set { 1, 5, 'some text' }
var o = {a: 1, b: 2};
mySet.add(o);

mySet.add({a: 1, b: 2}); // переменная o связана с другим объектом, поэтому данная строка также сработает

mySet.has(1); // true
mySet.has(3); // false, 3 не было добавлено в set
mySet.has(5);              // true
mySet.has(Math.sqrt(25));  // true
mySet.has("Some Text".toLowerCase()); // true
mySet.has(o); // true

mySet.size; // 5

mySet.delete(5); // удаляет 5 из set
mySet.has(5);    // false, 5 было удалено

mySet.size; // 4, было удалено одно значение
console.log(mySet); // Set {1, 'some text', Object {a: 1, b: 2}, Object {a: 1, b: 2}}

Обход Set

// обход элементов set
// выведет элементы по порядку: 1, "some text", {"a": 1, "b": 2}
for (let item of mySet) console.log(item);

// выведет элементы по порядку: 1, "some text", {"a": 1, "b": 2}
for (let item of mySet.keys()) console.log(item);
 
// выведет элементы по порядку: 1, "some text", {"a": 1, "b": 2}
for (let item of mySet.values()) console.log(item);

// выведет элементы по порядку: 1, "some text", {"a": 1, "b": 2} 
//(key и value в данном случае одинаковы)
for (let [key, value] of mySet.entries()) console.log(key);

// преобразует Set в Array
var myArr = Array.from(mySet); // [1, "some text", {"a": 1, "b": 2}]

// следующее будет работать при запуске с HTML документом
mySet.add(document.body);
mySet.has(document.querySelector("body")); // true

// преобразования из Array в Set и обратно
mySet2 = new Set([1,2,3,4]);
mySet2.size; // 4
[...mySet2]; // [1,2,3,4]

// пересечение можно представить следующим образом  
var intersection = new Set([...set1].filter(x => set2.has(x)));

// разность можно представить следующим образом
var difference = new Set([...set1].filter(x => !set2.has(x))); 

// Обход элементов set при помощи forEach
mySet.forEach(function(value) {
  console.log(value);
});

// 1
// 2
// 3
// 4

Реализование простых операций

function isSuperset(set, subset) {
    for (var elem of subset) {
        if (!set.has(elem)) {
            return false;
        }
    }
    return true;
}

function union(setA, setB) {
    var _union = new Set(setA);
    for (var elem of setB) {
        _union.add(elem);
    }
    return _union;
}

function intersection(setA, setB) {
    var _intersection = new Set();
    for (var elem of setB) {
        if (setA.has(elem)) {
            _intersection.add(elem);
        }
    }
    return _intersection;
}

function difference(setA, setB) {
    var _difference = new Set(setA);
    for (var elem of setB) {
        _difference.delete(elem);
    }
    return _difference;
}

// Например
var setA = new Set([1, 2, 3, 4]),
    setB = new Set([2, 3]),
    setC = new Set([3, 4, 5, 6]);

isSuperset(setA, setB);   // => true
union(setA, setC);        // => Set [1, 2, 3, 4, 5, 6]
intersection(setA, setC); // => Set [3, 4]
difference(setA, setC);   // => Set [1, 2]

Взаимоотношения с объектом Array

var myArray = ["value1", "value2", "value3"];

// Используйте конструктор Set для преобразования Array в Set
var mySet = new Set(myArray);

mySet.has("value1"); // вернёт true

// Используйте spread оператор для преобразования Set в Array
console.log([...mySet]); // Отобразит тот же массив, что и myArray

Взаимоотношения со String

var text = 'India';

var mySet = new Set(text);  // Set ['I', 'n', 'd', 'i', 'a']
mySet.size;  // 5

Спецификации

Спецификация Статус Комментарий
ECMAScript 2015 (6th Edition, ECMA-262)
Определение 'Set' в этой спецификации.
Стандарт Изначальное определение.
ECMAScript Latest Draft (ECMA-262)
Определение 'Set' в этой спецификации.
Черновик  

Совместимость с браузерами

We're converting our compatibility data into a machine-readable JSON format. This compatibility table still uses the old format, because we haven't yet converted the data it contains. Find out how you can help!

Возможность Chrome Firefox (Gecko) Internet Explorer Opera Safari
Базовая поддержка

31 [1]
38

13 (13) 11 25 7.1
Аргумент конструктора: new Set(iterable) 38 13 (13) Нет 25 9.0
Итерируемость 38 17 (17) Нет 25 7.1
Set.clear() 31 [1]
38
19 (19) 11 25 7.1

Set.keys(),

Set.values(),

Set.entries()

37 [1]
38
24 (24) Нет 25 7.1
Set.forEach() 36 [1]
38
25 (25) 11 25 7.1
Равенство ключей -0 и 0 34 [1]
38
29 (29) Нет 25 Нет
Constructor argument: new Set(null) (Да) 37 (37) ? ? ?
Monkey-patched add() in Constructor (Да) (Да) ? ? ?
Set[@@species] ? 41 (41) ? ? ?
Set() без new throws ? 42 (42) ? ? ?
Возможность Android Chrome for Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Базовая поддержка Нет 31 [1]
38
13.0 (13) Нет Нет 8
Аргумент конструктора: new Set(iterable) Нет 38 13.0 (13) Нет Нет Нет
Итерируемость Нет Нет 17.0 (17) Нет Нет 8
Set.clear() Нет 31 [1]
38
19.0 (19) Нет Нет 8
Set.keys(), Set.values(), Set.entries() Нет 37 [1]
38
24.0 (24) Нет Нет 8
Set.forEach() Нет 36 [1]
38
25.0 (25) Нет Нет 8
Равенство ключей -0 and 0 Нет 34 [1]
38
29.0 (29) Нет Нет Нет
Constructor argument: new Set(null) ? (Да) 37.0 (37) ? ? ?
Monkey-patched add() in Constructor ? (Да) 37.0 (37) ? ? ?
Set[@@species] ? ? 41.0 (41) ? ? ?
Set() без new throws ? ? 42.0 (42) ? ? ?

[1] Функция доступна при настройке. В chrome://flags, активируйте “Enable Experimental JavaScript”.

Смотрите также

Метки документа и участники

Внесли вклад в эту страницу: kan.a, SphinxKnight, dima74, papadima, vibecode, ViZhe, dtretyakov
Обновлялась последний раз: kan.a,