Set

Об'єкт Set дає можливість зберігати значення будь-якого типу, будь то примітивні значення чи посилання на об'єкт.

Синтаксис

new Set([iterable]);

Параметри

iterable
Якщо передається об'єкт, що ітерується, то всі його елементи будуть додані до нового Set. Якщо цей параметр не визначений або має значення null, тоді новий Set буде порожнім.

Значення, що повертається

Новий об'єкт Set.

Опис

Об'єкти Set  - це колекції унікальних значень. Ви можете перебирати елементи Set у порядку вставки. Одне значення в Set може зустрічатися лише один раз; воно є унікальним в колекції Set.

Еквівалентність значення

Через те, що кожне значення в Set має бути унікальним, еквівалентність значення буде перевірена. У попередній версії специфікації ECMAScript це не було базовано на такому самому алгоритмі, що використовує оператор ===. Конкретніше, для Set +0 (що є суворо рівним -0 ) та -0 є різними значеннями. Проте, це було змінено у специфікації ECMAScript 2015. Дивіться більш детально про "Еквівалентність значень -0 і 0" у таблиці браузерної сумісності.

До того ж, NaN та undefined також можуть зберігатися в SetNaN вважається тим самим, що і NaN (хоча, NaN !== NaN ).

Властивості

Set.length
Значення властивості length є 0.
get Set[@@species]
Функція-конструктор, що використовується для строрення derived об'єктів.
Set.prototype
Представляє прототип для конструктора Set. Дозволяє додавання властивостей до всіх Set об'єктів.

Set instances

Усі Set сутності наслідуються від Set.prototype.

Властивості

Методи

Приклади

Використання об'єкта  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}, {"a": 1, "b": 2}
for (let item of mySet) console.log(item);

// виводить елементи у послідовності: 1, "some text", {"a": 1, "b": 2}, {"a": 1, "b": 2}
for (let item of mySet.keys()) console.log(item);

// виводить елементи у послідовності: 1, "some text", {"a": 1, "b": 2}, {"a": 1, "b": 2}
for (let item of mySet.values()) console.log(item);

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

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

// наступне також буде працювати, якщо буде запущено в HTML документі
mySet.add(document.body);
mySet.has(document.querySelector('body')); // true

// конвертація між Set та Array
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

Імплементація базових операцій set

Set.prototype.isSuperset = function(subset) {
    for (var elem of subset) {
        if (!this.has(elem)) {
            return false;
        }
    }
    return true;
}

Set.prototype.union = function(setB) {
    var union = new Set(this);
    for (var elem of setB) {
        union.add(elem);
    }
    return union;
}

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

Set.prototype.difference = function(setB) {
    var difference = new Set(this);
    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]);

setA.isSuperset(setB); // => true
setA.union(setC); // => Set [1, 2, 3, 4, 5, 6]
setA.intersection(setC); // => Set [3, 4]
setA.difference(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]); // Виведе у точності такий самий Array як і myArray

Зв'язок зі Strings

var text = 'India';

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

Specifications

Browser compatibility

BCD tables only load in the browser

Дівіться також