--- title: Set slug: Web/JavaScript/Referencje/Obiekty/Set tags: - ECMAScript 2015 - ECMAScript6 - Global Objects - JavaScript - Object - set translation_of: Web/JavaScript/Reference/Global_Objects/Set ---
{{JSRef}}

Obiekt Set umożliwia przechowywanie unikalnych wartości każdego typu, zarówno {{Glossary("Primitive", "primitywów")}} jak i obiektów.

Składnia

new Set([iterable]);

Parametry

iterable
Jeżeli przekażesz obiekt iterowalny, wszystkie jego elementy zostaną dodane do nowego Set. Podczas gdy nie przekażemy żadnego parametru lub wartość parametru będzie równa null, zostanie stworzony pusty Set.

Zwracana wartość

Nowy obiekt Set.

Opis

Obiekt Set jest kolekcją wartości. Możesz iterować po elementach Set w kolejności, w której zostały dodane. Wartość w Set może występować tylko jeden raz.

Równość wartości

Dlatego, że każda wartość w Set musi być unikalna, musi zostać to sprawdzone. We wcześniejszych specyfikacjach ECMAScript nie było to oparte na tym samym algorytmie co w przypadku operatora ===. Konkretnie dla Set +0 (co jest tym samym co -0) i -0 były innymi wartościami. W specyfikacji ECMAScript 2015 zostało to zmienione. Zobacz "Value equality for -0 and 0" w tabeli Kompatybilność z przeglądarkami.

NaN i undefined mogą być przechowywane w Set. NaN w Set uważane jest za równe NaN, podczas gdy NaN !== NaN zwraca true

Własności

Set.length
Wartość length zawsze wynosi 0.
{{jsxref("Set.@@species", "get Set[@@species]")}}
Funkcja wykorzystywana do stworzenia pochodnych obiektów.
{{jsxref("Set.prototype")}}
Reprezentuje prototyp konstruktora Set. Pozwala na dodanie własności do obiektu Set.

Instancje Set

Wszystkie instancje Set dziedziczą od {{jsxref("Set.prototype")}}.

Własności

{{page('en-US/Web/JavaScript/Reference/Global_Objects/Set/prototype','Properties')}}

Metody

{{page('en-US/Web/JavaScript/Reference/Global_Objects/Set/prototype','Methods')}}

Przykłady

Użycie obiektu 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 jest referencją do innego obiektu, więc dwa obiekty zostają dodane do Set.

mySet.has(1); // true
mySet.has(3); // false, 3 nie zostało dodane do 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); // Usuwa 5 z Set.
mySet.has(5);    // false, 5 zostało usunięte.

mySet.size; // 4, usuneliśmy jedną wartość.
console.log(mySet);// Set {1, "some text", Object {a: 1, b: 2}, Object {a: 1, b: 2}}

Iterowanie po Set.

// Iterowanie po items w Set.
// wypisuje items w kolejności: 1, "some text", {"a": 1, "b": 2}
for (let item of mySet) console.log(item);

// wypisuje items w kolejności: 1, "some text", {"a": 1, "b": 2}
for (let item of mySet.keys()) console.log(item);

// wypisuje items w kolejności: 1, "some text", {"a": 1, "b": 2}
for (let item of mySet.values()) console.log(item);

// wypisuje items w kolejności: 1, "some text", {"a": 1, "b": 2}
//(key i value są takie same)
for (let [key, value] of mySet.entries()) console.log(key);

// zamienia Set na Array, przy użyciu Array.from
var myArr = Array.from(mySet); // [1, "some text", {"a": 1, "b": 2}]

// następujące funkcje również zadziałają, jeżeli skrypt odpalony jest w dokumencie HTML
mySet.add(document.body);
mySet.has(document.querySelector('body')); // true

// zamiana Array na Set i na odwrót
mySet2 = new Set([1, 2, 3, 4]);
mySet2.size; // 4
[...mySet2]; // [1, 2, 3, 4]

// Set z wartościami, które są w set1 i set2, może być uzyskany następująco
var intersection = new Set([...set1].filter(x => set2.has(x)));

// Set z różnicami wartości set1 i set2 może być uzyskany następująco
var difference = new Set([...set1].filter(x => !set2.has(x)));

// iterowanie po Set za pomocą .forEach
mySet.forEach(function(value) {
  console.log(value);
});
// 1
// 2
// 3
// 4

Implementacja podstawowych operacji 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;
}

// Przykłady
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]

Relacje z Tablicami (Array)

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

// Użycie konstruktora Set do zamiany Array na Set.
var mySet = new Set(myArray);

mySet.has('value1'); // => true

// Użycie spread operator do zamiany Set na Array.
console.log([...mySet]); // Will show you exactly the same Array as myArray

Specyfikacje

Specyfikacja Status Komentarz
{{SpecName('ES2015', '#sec-set-objects', 'Set')}} {{Spec2('ES2015')}} Początkowa definicja.
{{SpecName('ESDraft', '#sec-set-objects', 'Set')}} {{Spec2('ESDraft')}}  

Kompatybilność przeglądarek

{{CompatibilityTable}}

Feature Chrome Edge Firefox (Gecko) Internet Explorer Opera Safari
Basic support

{{ CompatChrome(38) }} [1]

12 {{ CompatGeckoDesktop("13") }} {{ CompatIE("11") }} 25 7.1
Constructor argument: new Set(iterable) {{ CompatChrome(38) }} 12 {{ CompatGeckoDesktop("13") }} {{CompatNo}} 25 9.0
iterable {{ CompatChrome(38) }} 12 {{ CompatGeckoDesktop("17") }} {{CompatNo}} 25 7.1
Set.add() returns the set {{ CompatChrome(38) }} 12 {{ CompatGeckoDesktop("13") }} {{CompatNo}} 25 7.1
Set.clear() {{ CompatChrome(38) }} 12 {{CompatGeckoDesktop("19")}} {{ CompatIE("11") }} 25 7.1
Set.keys(), Set.values(), Set.entries() {{ CompatChrome(38) }} 12 {{CompatGeckoDesktop("24")}} {{CompatNo}} 25 7.1
Set.forEach() {{ CompatChrome(38) }} 12 {{CompatGeckoDesktop("25")}} {{ CompatIE("11") }} 25 7.1
Value equality for -0 and 0 {{ CompatChrome(38) }} 12 {{CompatGeckoDesktop("29")}} {{CompatNo}} 25 {{CompatSafari(9)}}
Constructor argument: new Set(null) {{CompatVersionUnknown}} 12 {{CompatGeckoDesktop("37")}} {{CompatIE(11)}} {{CompatVersionUnknown}} {{CompatSafari(7.1)}}
Monkey-patched add() in Constructor {{CompatVersionUnknown}} 12 {{CompatGeckoDesktop("37")}} {{CompatNo}} {{CompatVersionUnknown}} {{CompatSafari(9)}}
Set[@@species] {{ CompatChrome(51) }} 13 {{CompatGeckoDesktop("41")}} {{CompatNo}} {{ CompatOpera(38) }} {{CompatSafari(10)}}
Set() without new throws {{CompatVersionUnknown}} 12 {{CompatGeckoDesktop("42")}} {{CompatIE(11)}} {{CompatVersionUnknown}} 9
Feature Android Chrome for Android Edge Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Basic support {{CompatNo}} {{CompatChrome(38)}} [1] {{CompatVersionUnknown}} {{ CompatGeckoMobile("13") }} {{CompatNo}} {{CompatNo}} 8
Constructor argument: new Set(iterable) {{CompatNo}} {{CompatChrome(38)}} {{CompatVersionUnknown}} {{ CompatGeckoMobile("13") }} {{CompatNo}} {{CompatNo}} 9
iterable {{CompatNo}} {{CompatNo}} {{CompatVersionUnknown}} {{ CompatGeckoMobile("17") }} {{CompatNo}} {{CompatNo}} 8
Set.clear() {{CompatNo}} {{ CompatChrome(38) }} {{CompatVersionUnknown}} {{CompatGeckoMobile("19")}} {{CompatNo}} {{CompatNo}} 8
Set.keys(), Set.values(), Set.entries() {{CompatNo}} {{ CompatChrome(38) }} {{CompatVersionUnknown}} {{CompatGeckoMobile("24")}} {{CompatNo}} {{CompatNo}} 8
Set.forEach() {{CompatNo}} {{ CompatChrome(38) }} {{CompatVersionUnknown}} {{CompatGeckoMobile("25")}} {{CompatNo}} {{CompatNo}} 8
Value equality for -0 and 0 {{CompatNo}} {{ CompatChrome(38) }} {{CompatVersionUnknown}} {{CompatGeckoMobile("29")}} {{CompatNo}} {{CompatNo}} 9
Constructor argument: new Set(null) {{CompatUnknown}} {{CompatVersionUnknown}} {{CompatVersionUnknown}} {{CompatGeckoMobile("37")}} {{CompatUnknown}} {{CompatUnknown}} 8
Monkey-patched add() in Constructor {{CompatUnknown}} {{CompatVersionUnknown}} {{CompatVersionUnknown}} {{CompatGeckoMobile("37")}} {{CompatUnknown}} {{CompatUnknown}} 9
Set[@@species] {{CompatUnknown}} {{CompatUnknown}} {{CompatVersionUnknown}} {{CompatGeckoMobile("41")}} {{CompatUnknown}} {{CompatUnknown}} 10
Set() without new throws {{CompatUnknown}} {{CompatUnknown}} {{CompatVersionUnknown}} {{CompatGeckoMobile("42")}} {{CompatUnknown}} {{CompatUnknown}} 9

[1] The feature was available behind a preference from Chrome 31. In chrome://flags, activate the entry “Enable Experimental JavaScript”.

Zobacz również