Set

Sie lesen die englische Version dieses Inhalts, da für dieses Gebietsschema noch keine Übersetzung vorhanden ist. Helfen Sie uns, diesen Artikel zu übersetzen!

Ein Set-Objekt speichert eindeutige Werte jedes beliebigen Typs, egal ob es sich dabei um primitive Werte oder Objektreferenzen handelt.

Syntax

new Set([iterable]);

Parameter

iterable
Ein iterierbares Objekt, dessen Elemente zum neuen Set hinzugefügt werden sollen.
Ist dieser Parameter nicht angegeben oder null, wird ein leeres Set erzeugt.

Rückgabewert

Ein neues Set Objekt.

Beschreibung

Set Objekte sind Sammlungen von Werten. Man kann über die Elemente iterieren; sie werden in der Reihenfolge ihres Hinzufügens gespeichert. Jeder Wert ist nur einmal vorhanden; er ist im Set eindeutig.

Gleichheit

Da jeder Wert innerhalb eines Sets eindeutig sein muss, werden alle Werte auf Gleichheit überprüft. In einer früheren Version der ECMAScript Spezifikation verhielt sich der Algorithmus dafür anders als der für den === Operator. Insbesondere waren für Sets +0 und -0 verschiedene Werte (obwohl sie streng gleich sind). In der ECMAScript 2015 Spezifikation wurde das geändert, so dass +0 und -0 jetzt jeweils als gleicher Wert gelten. Siehe auch den Eintrag "Key equality for -0 and 0" in der Übersicht zur Browserkompatibilität.

NaN und undefined können ebenfalls in einem Set gespeichert werden. Dabei werden alle NaN Werte gleichgesetzt, d.h. NaN gilt gleich NaN (auch wenn NaN !== NaN).

Eigenschaften

Set.length
Der Wert der Eigenschaft length ist immer 0.
Die Anzahl der Elemente eines Sets befindet sich in Set.prototype.size.
get Set[@@species]
Die Konstruktorfunktion, um abgeleitete Objekte zu erzeugen.
Set.prototype
Prototyp für den Set Konstruktor. Ermöglicht das Hinzufügen von Eigenschaften zu allen Set Objekten.

Set Instanzen

Alle Set Instanzen erben von Set.prototype.

Eigenschaften

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.

Methoden

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.

Beispiele

Verwenden eines Set Objekts

var mySet = new Set();

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

mySet.has(1); // true
mySet.has(3); // false, 3 has not been added to the set
mySet.has(5);              // true
mySet.has(Math.sqrt(25));  // true
mySet.has("Some Text".toLowerCase()); // true
mySet.has(o); // true

mySet.size; // 4

mySet.delete(5); // removes 5 from the set
mySet.has(5);    // false, 5 has been removed

mySet.size; // 3, we just removed one value

Iterieren über ein Set

// iterate over items in set
// logs the items in the order: 1, "some text" 
for (let item of mySet) console.log(item);

// logs the items in the order: 1, "some text" 
for (let item of mySet.keys()) console.log(item);
 
// logs the items in the order: 1, "some text" 
for (let item of mySet.values()) console.log(item);

// logs the items in the order: 1, "some text" 
//(key and value are the same here)
for (let [key, value] of mySet.entries()) console.log(key);

// convert set to plain Array
var myArr = Array.from(mySet); // [1, "some text"]

// the following will also work if run in an HTML document
mySet.add(document.body);
mySet.has(document.querySelector("body")); // true

// converting between Set and Array
mySet2 = new Set([1,2,3,4]);
mySet2.size; // 4
[...mySet2]; // [1,2,3,4]

// intersect can be simulated via 
var intersection = new Set([...set1].filter(x => set2.has(x)));

// difference can be simulated via
var difference = new Set([...set1].filter(x => !set2.has(x)));

// Iterate set entries with forEach
mySet.forEach(function(value) {
  console.log(value);
});

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

Gebräuchliche Set Operationen implementieren

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 symmetricDifference(setA, setB) {
    var _difference = new Set(setA);
    for (var elem of setB) {
        if (_difference.has(elem)) {
            _difference.delete(elem);
        } else {
            _difference.add(elem);
        }
    }
    return _difference;
}

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

//Examples
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]
symmetricDifference(setA, setC); // => Set [1, 2, 5, 6]
difference(setA, setC); // => Set [1, 2]

Array und Set

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

// Use the regular Set constructor to transform an Array into a Set
var mySet = new Set(myArray);

mySet.has("value1"); // returns true

// Use the spread operator to transform a set into an Array.
console.log([...mySet]); // Will show you exactly the same Array as myArray

Duplikate entfernen aus einem Array

// Use to remove duplicate elements from the array 

const numbers = [2,3,4,4,2,3,3,4,4,5,5,6,6,7,5,32,3,4,5]

console.log([...new Set(numbers)]) 

// [2, 3, 4, 5, 6, 7, 32]

String und Set

var text = 'India';

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

Spezifikationen

Specification Status Comment
ECMAScript 2015 (6th Edition, ECMA-262)
Die Definition von 'Set' in dieser Spezifikation.
Standard Initial definition.
ECMAScript Latest Draft (ECMA-262)
Die Definition von 'Set' in dieser Spezifikation.
Entwurf

Browserkompatibilität

Update compatibility data on GitHub
DesktopMobileServer
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid WebviewChrome für AndroidFirefox für AndroidOpera für AndroidSafari auf iOSSamsung InternetNode.js
SetChrome Vollständige Unterstützung 38Edge Vollständige Unterstützung 12Firefox Vollständige Unterstützung 13IE Vollständige Unterstützung 11Opera Vollständige Unterstützung 25Safari Vollständige Unterstützung 8WebView Android Vollständige Unterstützung 38Chrome Android Vollständige Unterstützung 38Firefox Android Vollständige Unterstützung 14Opera Android Vollständige Unterstützung 25Safari iOS Vollständige Unterstützung 8Samsung Internet Android Vollständige Unterstützung 3.0nodejs Vollständige Unterstützung 0.12
Vollständige Unterstützung 0.12
Vollständige Unterstützung 0.10
Deaktiviert
Deaktiviert From version 0.10: this feature is behind the --harmony runtime flag.
addChrome Vollständige Unterstützung 38Edge Vollständige Unterstützung 12Firefox Vollständige Unterstützung 13IE Teilweise Unterstützung 11
Hinweise
Teilweise Unterstützung 11
Hinweise
Hinweise Returns 'undefined' instead of the 'Set' object.
Opera Vollständige Unterstützung 25Safari Vollständige Unterstützung 8WebView Android Vollständige Unterstützung 38Chrome Android Vollständige Unterstützung 38Firefox Android Vollständige Unterstützung 14Opera Android Vollständige Unterstützung 25Safari iOS Vollständige Unterstützung 8Samsung Internet Android Vollständige Unterstützung 3.0nodejs Vollständige Unterstützung Ja
clearChrome Vollständige Unterstützung 38Edge Vollständige Unterstützung 12Firefox Vollständige Unterstützung 19IE Vollständige Unterstützung 11Opera Vollständige Unterstützung 25Safari Vollständige Unterstützung 8WebView Android Vollständige Unterstützung 38Chrome Android Vollständige Unterstützung 38Firefox Android Vollständige Unterstützung 19Opera Android Vollständige Unterstützung 25Safari iOS Vollständige Unterstützung 8Samsung Internet Android Vollständige Unterstützung 3.0nodejs Vollständige Unterstützung 0.12
deleteChrome Vollständige Unterstützung 38Edge Vollständige Unterstützung 12Firefox Vollständige Unterstützung 13IE Vollständige Unterstützung 11Opera Vollständige Unterstützung 25Safari Vollständige Unterstützung 8WebView Android Vollständige Unterstützung 38Chrome Android Vollständige Unterstützung 38Firefox Android Vollständige Unterstützung 14Opera Android Vollständige Unterstützung 25Safari iOS Vollständige Unterstützung 8Samsung Internet Android Vollständige Unterstützung 3.0nodejs Vollständige Unterstützung 0.12
Vollständige Unterstützung 0.12
Vollständige Unterstützung 0.10
Deaktiviert
Deaktiviert From version 0.10: this feature is behind the --harmony runtime flag.
entriesChrome Vollständige Unterstützung 38Edge Vollständige Unterstützung 12Firefox Vollständige Unterstützung 24IE Keine Unterstützung NeinOpera Vollständige Unterstützung 25Safari Vollständige Unterstützung 8WebView Android Vollständige Unterstützung 38Chrome Android Vollständige Unterstützung 38Firefox Android Vollständige Unterstützung 24Opera Android Vollständige Unterstützung 25Safari iOS Vollständige Unterstützung 8Samsung Internet Android Vollständige Unterstützung 3.0nodejs Vollständige Unterstützung 0.12
forEachChrome Vollständige Unterstützung 38Edge Vollständige Unterstützung 12Firefox Vollständige Unterstützung 25IE Vollständige Unterstützung 11Opera Vollständige Unterstützung 25Safari Vollständige Unterstützung 8WebView Android Vollständige Unterstützung 38Chrome Android Vollständige Unterstützung 38Firefox Android Vollständige Unterstützung 25Opera Android Vollständige Unterstützung 25Safari iOS Vollständige Unterstützung 8Samsung Internet Android Vollständige Unterstützung 3.0nodejs Vollständige Unterstützung 0.12
hasChrome Vollständige Unterstützung 38Edge Vollständige Unterstützung 12Firefox Vollständige Unterstützung 13IE Vollständige Unterstützung 11Opera Vollständige Unterstützung 25Safari Vollständige Unterstützung 8WebView Android Vollständige Unterstützung 38Chrome Android Vollständige Unterstützung 38Firefox Android Vollständige Unterstützung 14Opera Android Vollständige Unterstützung 25Safari iOS Vollständige Unterstützung 8Samsung Internet Android Vollständige Unterstützung 3.0nodejs Vollständige Unterstützung Ja
Key equality for -0 and 0Chrome Vollständige Unterstützung 38Edge Vollständige Unterstützung 12Firefox Vollständige Unterstützung 29IE Keine Unterstützung NeinOpera Vollständige Unterstützung 25Safari Vollständige Unterstützung 9WebView Android Vollständige Unterstützung 38Chrome Android Vollständige Unterstützung 38Firefox Android Vollständige Unterstützung 29Opera Android Vollständige Unterstützung 25Safari iOS Vollständige Unterstützung 9Samsung Internet Android Vollständige Unterstützung 3.0nodejs Vollständige Unterstützung 4.0.0
prototypeChrome Vollständige Unterstützung 38Edge Vollständige Unterstützung 12Firefox Vollständige Unterstützung 13IE Vollständige Unterstützung 11Opera Vollständige Unterstützung 25Safari Vollständige Unterstützung 8WebView Android Vollständige Unterstützung 38Chrome Android Vollständige Unterstützung 38Firefox Android Vollständige Unterstützung 14Opera Android Vollständige Unterstützung 25Safari iOS Vollständige Unterstützung 8Samsung Internet Android Vollständige Unterstützung 3.0nodejs Vollständige Unterstützung Ja
new Set(iterable)Chrome Vollständige Unterstützung 38Edge Vollständige Unterstützung 12Firefox Vollständige Unterstützung 13IE Keine Unterstützung NeinOpera Vollständige Unterstützung 25Safari Vollständige Unterstützung 9WebView Android Vollständige Unterstützung 38Chrome Android Vollständige Unterstützung 38Firefox Android Vollständige Unterstützung 14Opera Android Vollständige Unterstützung 25Safari iOS Vollständige Unterstützung 9Samsung Internet Android Vollständige Unterstützung 3.0nodejs Vollständige Unterstützung 0.12
new Set(null)Chrome Vollständige Unterstützung 38Edge Vollständige Unterstützung 12Firefox Vollständige Unterstützung 37IE Vollständige Unterstützung 11Opera Vollständige Unterstützung 25Safari Vollständige Unterstützung 9WebView Android Vollständige Unterstützung 38Chrome Android Vollständige Unterstützung 38Firefox Android Vollständige Unterstützung 37Opera Android Vollständige Unterstützung 25Safari iOS Vollständige Unterstützung 9Samsung Internet Android Vollständige Unterstützung 3.0nodejs Vollständige Unterstützung 0.12
Vollständige Unterstützung 0.12
Vollständige Unterstützung 0.10
Deaktiviert
Deaktiviert From version 0.10: this feature is behind the --harmony runtime flag.
Set() without new throwsChrome Vollständige Unterstützung 38Edge Vollständige Unterstützung 12Firefox Vollständige Unterstützung 42IE Vollständige Unterstützung 11Opera Vollständige Unterstützung 25Safari Vollständige Unterstützung 9WebView Android Vollständige Unterstützung 38Chrome Android Vollständige Unterstützung 38Firefox Android Vollständige Unterstützung 42Opera Android Vollständige Unterstützung 25Safari iOS Vollständige Unterstützung 9Samsung Internet Android Vollständige Unterstützung 3.0nodejs Vollständige Unterstützung 0.12
sizeChrome Vollständige Unterstützung 38Edge Vollständige Unterstützung 12Firefox Vollständige Unterstützung 19
Hinweise
Vollständige Unterstützung 19
Hinweise
Hinweise 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 Vollständige Unterstützung 11Opera Vollständige Unterstützung 25Safari Vollständige Unterstützung 8WebView Android Vollständige Unterstützung 38Chrome Android Vollständige Unterstützung 38Firefox Android Vollständige Unterstützung 19
Hinweise
Vollständige Unterstützung 19
Hinweise
Hinweise 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 Vollständige Unterstützung 25Safari iOS Vollständige Unterstützung 8Samsung Internet Android Vollständige Unterstützung 3.0nodejs Vollständige Unterstützung 0.12
valuesChrome Vollständige Unterstützung 38Edge Vollständige Unterstützung 12Firefox Vollständige Unterstützung 24IE Keine Unterstützung NeinOpera Vollständige Unterstützung 25Safari Vollständige Unterstützung 8WebView Android Vollständige Unterstützung 38Chrome Android Vollständige Unterstützung 38Firefox Android Vollständige Unterstützung 24Opera Android Vollständige Unterstützung 25Safari iOS Vollständige Unterstützung 8Samsung Internet Android Vollständige Unterstützung 3.0nodejs Vollständige Unterstützung 0.12
@@iteratorChrome Vollständige Unterstützung 43Edge Vollständige Unterstützung 12Firefox Vollständige Unterstützung 36
Vollständige Unterstützung 36
Keine Unterstützung 27 — 36
Hinweise Alternativer Name
Hinweise A placeholder property named @@iterator is used.
Alternativer Name Verwendet den nicht standardisierten Namen: @@iterator
Keine Unterstützung 17 — 27
Hinweise Alternativer Name
Hinweise A placeholder property named iterator is used.
Alternativer Name Verwendet den nicht standardisierten Namen: iterator
IE Keine Unterstützung NeinOpera Vollständige Unterstützung 30Safari Vollständige Unterstützung JaWebView Android Vollständige Unterstützung 43Chrome Android Vollständige Unterstützung 43Firefox Android Vollständige Unterstützung 36
Vollständige Unterstützung 36
Keine Unterstützung 27 — 36
Hinweise Alternativer Name
Hinweise A placeholder property named @@iterator is used.
Alternativer Name Verwendet den nicht standardisierten Namen: @@iterator
Keine Unterstützung 17 — 27
Hinweise Alternativer Name
Hinweise A placeholder property named iterator is used.
Alternativer Name Verwendet den nicht standardisierten Namen: iterator
Opera Android Vollständige Unterstützung 30Safari iOS Vollständige Unterstützung JaSamsung Internet Android Vollständige Unterstützung 4.0nodejs Vollständige Unterstützung 0.12
@@speciesChrome Vollständige Unterstützung 51Edge Vollständige Unterstützung 13Firefox Vollständige Unterstützung 41IE Keine Unterstützung NeinOpera Vollständige Unterstützung 38Safari Vollständige Unterstützung 10WebView Android Vollständige Unterstützung 51Chrome Android Vollständige Unterstützung 51Firefox Android Vollständige Unterstützung 41Opera Android Vollständige Unterstützung 41Safari iOS Vollständige Unterstützung 10Samsung Internet Android Vollständige Unterstützung 5.0nodejs Vollständige Unterstützung 6.5.0
Vollständige Unterstützung 6.5.0
Vollständige Unterstützung 6.0.0
Deaktiviert
Deaktiviert From version 6.0.0: this feature is behind the --harmony runtime flag.

Legende

Vollständige Unterstützung  
Vollständige Unterstützung
Teilweise Unterstützung  
Teilweise Unterstützung
Keine Unterstützung  
Keine Unterstützung
Siehe Implementierungshinweise.
Siehe Implementierungshinweise.
Benutzer muss dieses Feature explizit aktivieren.
Benutzer muss dieses Feature explizit aktivieren.
Verwendet einen nicht standardisierten Namen.
Verwendet einen nicht standardisierten Namen.

See also