Sets sind jetzt in ES2015 verfügbar (auch bekannt als ES6, dh ECMAScript 6). ES6 ist seit Juni 2015 der aktuelle Standard für JavaScript.
ECMAScript 6 hat die Datenstruktur Set, die für beliebige Werte funktioniert, schnell ist und NaN korrekt behandelt. - Axel Rauschmayer , Exploring ES6
Die ersten beiden Beispiele aus Axel Rauschmayers Buch Exploring ES6 :
Einzelne Elemente verwalten:
> let set = new Set();
> set.add('red')
> set.has('red')
true
> set.delete('red')
true
> set.has('red')
false
Bestimmen der Größe eines Sets und Löschen:
> let set = new Set();
> set.add('red')
> set.add('green')
> set.size
2
> set.clear();
> set.size
0
Ich würde Exploring ES6 ausprobieren, wenn Sie mehr über Sets in JavaScript erfahren möchten. Das Buch kann kostenlos online gelesen werden. Wenn Sie jedoch den Autor Dr. Axel Rauschmayer unterstützen möchten, können Sie das Buch für etwa 30 US-Dollar erwerben.
Wenn Sie jetzt Sets und ES6 verwenden möchten, können Sie Babel , den Transpiler ES6 zu ES5 und seine Polyfills verwenden.
Bearbeiten: Ab dem 6. Juni 2017 bieten die meisten gängigen Browser in ihren neuesten Versionen (außer IE 11) vollständige Set-Unterstützung. Dies bedeutet, dass Sie möglicherweise kein Babel benötigen, wenn Sie ältere Browser nicht unterstützen möchten. Wenn Sie die Kompatibilität in verschiedenen Browsern einschließlich Ihres aktuellen Browsers anzeigen möchten, überprüfen Sie die ES6-Kompatibilitätstabelle von Kangax .
BEARBEITEN:
Nur Klarstellung zur Initialisierung. Sets können jede synchrone Iteration in ihrem Konstruktor annehmen. Dies bedeutet, dass sie nicht nur Arrays, sondern auch Strings und Iteratoren verwenden können. Nehmen Sie zum Beispiel die folgende Array- und String-Initialisierung einer Menge:
const set1 = new Set(['a','a','b','b','c','c']);
console.log(...set1);
console.log(set1.size);
const set2 = new Set("aabbcc");
console.log(...set2);
console.log(set2.size);
Beide Ausgänge des Arrays und des Strings sind gleich. Beachten Sie, dass dies ...set1
die Spread-Syntax ist . Es scheint, dass jedes Element der Iterable einzeln zur Menge hinzugefügt wird. Da also sowohl das Array als auch die Zeichenfolge dieselben Elemente haben und die Elemente in derselben Reihenfolge sind, wird die Menge gleich erstellt. Eine andere Sache, die Sie bei Mengen beachten sollten, ist, dass beim Iterieren über sie die Iterationsreihenfolge der Reihenfolge folgt, in der die Elemente in die Menge eingefügt wurden. Hier ist ein Beispiel für das Durchlaufen einer Menge:
const set1 = new Set(['a','a','b','b','c','c']);
for(const element of set1) {
console.log(element);
}
Da Sie zum Initialisieren eines Satzes jedes Iterable verwenden können, können Sie sogar einen Iterator aus einer Generatorfunktion verwenden . Hier sind zwei Beispiele für Iteratorinitialisierungen, die dieselbe Ausgabe erzeugen:
function* getLetters1 () {
yield 'a';
yield 'a';
yield 'b';
yield 'b';
yield 'c';
yield 'c';
}
function* getLetters2 (letters, repeatTimes) {
for(const letter of letters) {
for(let i = 0; i < repeatTimes; ++i) {
yield letter;
}
}
}
console.log("------ getLetters1 ------");
console.log(...getLetters1());
const set3 = new Set(getLetters1());
console.log(...set3);
console.log(set3.size);
console.log("------ getLetters2 ------");
console.log(...getLetters2('abc', 2));
const set4 = new Set(getLetters2('abc', 2));
console.log(...set4);
console.log(set4.size);
Die Generatorfunktionen dieser Beispiele könnten nur so geschrieben werden, dass sie sich nicht wiederholen. Wenn die Generatorfunktion jedoch komplizierter ist und sich die Leistung nicht zu negativ auf das Folgende auswirkt, können Sie die Set-Methode verwenden, um nur Werte von einem Generator abzurufen, der dies nicht tut nicht wiederholen.
Wenn Sie mehr über Sets erfahren möchten, ohne das Kapitel von Dr. Rauschmayer in seinem Buch zu lesen, können Sie die MDN-Dokumente zu Set lesen . MDN hat auch weitere Beispiele für das Iterieren über einen Satz wie die Verwendung forEach
und die Verwendung der .keys
, .values
und .entries
Methoden. MDN enthält auch Beispiele wie Mengenvereinigung, Mengenschnitt, Mengenunterschied, symmetrische Mengenunterschiede und Mengenüberprüfungsprüfung. Hoffentlich werden die meisten dieser Vorgänge in JavaScript verfügbar sein, ohne dass Sie eigene Funktionen erstellen müssen, die sie unterstützen. Tatsächlich gibt es diesen TC39-Vorschlag für neue Set-Methoden, die hoffentlich zu einem späteren Zeitpunkt die folgenden Methoden zu Set in JavaScript hinzufügen sollten, wenn der Vorschlag Stufe 4 erreicht:
- Set.prototype.intersection (iterable) - Methode erstellt eine neue Set-Instanz durch Set-Schnittpunktoperation.
- Set.prototype.union (iterable) - Methode erstellt eine neue Set-Instanz durch Set Union-Operation.
- Set.prototype.difference (iterable) - Methode erstellt ein neues Set ohne Elemente, die in iterable vorhanden sind.
- Set.prototype.symmetricDifference (iterable) - gibt eine Reihe von Elementen zurück, die nur in diesem oder in iterable gefunden wurden.
- Set.prototype.isSubsetOf (iterierbar)
- Set.prototype.isDisjointFrom (iterierbar)
- Set.prototype.isSupersetOf (iterierbar)
'Tom' in set
es wahr aussieht? Es sieht sehr danach aus, als hätten Sie falsche Annahmen über etwas , und ich versuche herauszufinden, worüber .