Set

Сводка

Объекты 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 [value, 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' в этой спецификации.
Черновик  

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

Update compatibility data on GitHub
КомпьютерыМобильныеServer
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewChrome для AndroidFirefox для AndroidOpera для AndroidSafari on iOSSamsung InternetNode.js
SetChrome Полная поддержка 38Edge Полная поддержка 12Firefox Полная поддержка 13IE Полная поддержка 11Opera Полная поддержка 25Safari Полная поддержка 8WebView Android Полная поддержка 38Chrome Android Полная поддержка 38Firefox Android Полная поддержка 14Opera Android Полная поддержка 25Safari iOS Полная поддержка 8Samsung Internet Android Полная поддержка Даnodejs Полная поддержка 0.12
Полная поддержка 0.12
Полная поддержка 0.10
Отключено
Отключено From version 0.10: this feature is behind the --harmony runtime flag.
addChrome Полная поддержка 38Edge Полная поддержка 12Firefox Полная поддержка 13IE Частичная поддержка 11
Замечания
Частичная поддержка 11
Замечания
Замечания Returns 'undefined' instead of the 'Set' object.
Opera Полная поддержка 25Safari Полная поддержка 8WebView Android Полная поддержка 38Chrome Android Полная поддержка 38Firefox Android Полная поддержка 14Opera Android Полная поддержка 25Safari iOS Полная поддержка 8Samsung Internet Android Полная поддержка Даnodejs Полная поддержка Да
clearChrome Полная поддержка 38Edge Полная поддержка 12Firefox Полная поддержка 19IE Полная поддержка 11Opera Полная поддержка 25Safari Полная поддержка 8WebView Android Полная поддержка 38Chrome Android Полная поддержка 38Firefox Android Полная поддержка 19Opera Android Полная поддержка 25Safari iOS Полная поддержка 8Samsung Internet Android Полная поддержка Даnodejs Полная поддержка 0.12
deleteChrome Полная поддержка 38Edge Полная поддержка 12Firefox Полная поддержка 13IE Полная поддержка 11Opera Полная поддержка 25Safari Полная поддержка 8WebView Android Полная поддержка 38Chrome Android Полная поддержка 38Firefox Android Полная поддержка 14Opera Android Полная поддержка 25Safari iOS Полная поддержка 8Samsung Internet Android Полная поддержка Даnodejs Полная поддержка 0.12
Полная поддержка 0.12
Полная поддержка 0.10
Отключено
Отключено From version 0.10: this feature is behind the --harmony runtime flag.
entriesChrome Полная поддержка 38Edge Полная поддержка 12Firefox Полная поддержка 24IE Нет поддержки НетOpera Полная поддержка 25Safari Полная поддержка 8WebView Android Полная поддержка 38Chrome Android Полная поддержка 38Firefox Android Полная поддержка 24Opera Android Полная поддержка 25Safari iOS Полная поддержка 8Samsung Internet Android Полная поддержка Даnodejs Полная поддержка 0.12
forEachChrome Полная поддержка 38Edge Полная поддержка 12Firefox Полная поддержка 25IE Полная поддержка 11Opera Полная поддержка 25Safari Полная поддержка 8WebView Android Полная поддержка 38Chrome Android Полная поддержка 38Firefox Android Полная поддержка 25Opera Android Полная поддержка 25Safari iOS Полная поддержка 8Samsung Internet Android Полная поддержка Даnodejs Полная поддержка 0.12
hasChrome Полная поддержка 38Edge Полная поддержка 12Firefox Полная поддержка 13IE Полная поддержка 11Opera Полная поддержка 25Safari Полная поддержка 8WebView Android Полная поддержка 38Chrome Android Полная поддержка 38Firefox Android Полная поддержка 14Opera Android Полная поддержка 25Safari iOS Полная поддержка 8Samsung Internet Android Полная поддержка Даnodejs Полная поддержка Да
Key equality for -0 and 0Chrome Полная поддержка 38Edge Полная поддержка 12Firefox Полная поддержка 29IE Нет поддержки НетOpera Полная поддержка 25Safari Полная поддержка 9WebView Android Полная поддержка 38Chrome Android Полная поддержка 38Firefox Android Полная поддержка 29Opera Android Полная поддержка 25Safari iOS Полная поддержка 9Samsung Internet Android Полная поддержка Даnodejs Полная поддержка 4.0.0
prototypeChrome Полная поддержка 38Edge Полная поддержка 12Firefox Полная поддержка 13IE Полная поддержка 11Opera Полная поддержка 25Safari Полная поддержка 8WebView Android Полная поддержка 38Chrome Android Полная поддержка 38Firefox Android Полная поддержка 14Opera Android Полная поддержка 25Safari iOS Полная поддержка 8Samsung Internet Android Полная поддержка Даnodejs Полная поддержка Да
new Set(iterable)Chrome Полная поддержка 38Edge Полная поддержка 12Firefox Полная поддержка 13IE Нет поддержки НетOpera Полная поддержка 25Safari Полная поддержка 9WebView Android Полная поддержка 38Chrome Android Полная поддержка 38Firefox Android Полная поддержка 14Opera Android Полная поддержка 25Safari iOS Полная поддержка 9Samsung Internet Android Полная поддержка Даnodejs Полная поддержка 0.12
new Set(null)Chrome Полная поддержка ДаEdge Полная поддержка 12Firefox Полная поддержка 37IE Полная поддержка 11Opera Полная поддержка ДаSafari Полная поддержка 9WebView Android Полная поддержка ДаChrome Android Полная поддержка ДаFirefox Android Полная поддержка 37Opera Android Полная поддержка ДаSafari iOS Полная поддержка 9Samsung Internet Android Полная поддержка Даnodejs Полная поддержка 0.12
Полная поддержка 0.12
Полная поддержка 0.10
Отключено
Отключено From version 0.10: this feature is behind the --harmony runtime flag.
Set() without new throwsChrome Полная поддержка ДаEdge Полная поддержка 12Firefox Полная поддержка 42IE Полная поддержка 11Opera Полная поддержка ДаSafari Полная поддержка 9WebView Android Полная поддержка ДаChrome Android Полная поддержка ДаFirefox Android Полная поддержка 42Opera Android Полная поддержка ДаSafari iOS Полная поддержка 9Samsung Internet Android Полная поддержка Даnodejs Полная поддержка 0.12
sizeChrome Полная поддержка 38Edge Полная поддержка 12Firefox Полная поддержка 19
Замечания
Полная поддержка 19
Замечания
Замечания From Firefox 13 to Firefox 18, the size property was implemented as a Set.prototype.size() method, this has been changed to a property in later versions conform to the ECMAScript 2015 specification.
IE Полная поддержка 11Opera Полная поддержка 25Safari Полная поддержка 8WebView Android Полная поддержка 38Chrome Android Полная поддержка 38Firefox Android Полная поддержка 19
Замечания
Полная поддержка 19
Замечания
Замечания From Firefox 13 to Firefox 18, the size property was implemented as a Set.prototype.size() method, this has been changed to a property in later versions conform to the ECMAScript 2015 specification.
Opera Android Полная поддержка 25Safari iOS Полная поддержка 8Samsung Internet Android Полная поддержка Даnodejs Полная поддержка 0.12
valuesChrome Полная поддержка 38Edge Полная поддержка 12Firefox Полная поддержка 24IE Нет поддержки НетOpera Полная поддержка 25Safari Полная поддержка 8WebView Android Полная поддержка 38Chrome Android Полная поддержка 38Firefox Android Полная поддержка 24Opera Android Полная поддержка 25Safari iOS Полная поддержка 8Samsung Internet Android Полная поддержка Даnodejs Полная поддержка 0.12
@@iteratorChrome Полная поддержка ДаEdge Полная поддержка ДаFirefox Полная поддержка 36
Полная поддержка 36
Нет поддержки 27 — 36
Замечания Альтернативное имя
Замечания A placeholder property named @@iterator is used.
Альтернативное имя Использует нестандартное имя: @@iterator
Нет поддержки 17 — 27
Замечания Альтернативное имя
Замечания A placeholder property named iterator is used.
Альтернативное имя Использует нестандартное имя: iterator
IE Нет поддержки НетOpera Полная поддержка ДаSafari Полная поддержка ДаWebView Android Полная поддержка ДаChrome Android Полная поддержка ДаFirefox Android Полная поддержка 36
Полная поддержка 36
Нет поддержки 27 — 36
Замечания Альтернативное имя
Замечания A placeholder property named @@iterator is used.
Альтернативное имя Использует нестандартное имя: @@iterator
Нет поддержки 17 — 27
Замечания Альтернативное имя
Замечания A placeholder property named iterator is used.
Альтернативное имя Использует нестандартное имя: iterator
Opera Android Полная поддержка ДаSafari iOS Полная поддержка ДаSamsung Internet Android Полная поддержка Даnodejs Полная поддержка 0.12
@@speciesChrome Полная поддержка 51Edge Полная поддержка 13Firefox Полная поддержка 41IE Нет поддержки НетOpera Полная поддержка 38Safari Полная поддержка 10WebView Android Полная поддержка 51Chrome Android Полная поддержка 51Firefox Android Полная поддержка 41Opera Android Полная поддержка 41Safari iOS Полная поддержка 10Samsung Internet Android Полная поддержка 5.0nodejs Полная поддержка 6.5.0
Полная поддержка 6.5.0
Полная поддержка 6.0.0
Отключено
Отключено From version 6.0.0: this feature is behind the --harmony runtime flag.

Легенда

Полная поддержка  
Полная поддержка
Частичная поддержка  
Частичная поддержка
Нет поддержки  
Нет поддержки
Смотрите замечания реализации.
Смотрите замечания реализации.
Пользователь должен сам включить эту возможность.
Пользователь должен сам включить эту возможность.
Использует нестандартное имя.
Использует нестандартное имя.

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