Zestawy są teraz dostępne w ES2015 (aka ES6, czyli ECMAScript 6). ES6 to obecny standard JavaScript od czerwca 2015.
ECMAScript 6 ma strukturę danych Set, która działa dla dowolnych wartości, jest szybki i poprawnie obsługuje NaN. - Axel Rauschmayer , Exploring ES6
Pierwsze dwa przykłady z książki Axela Rauschmayera Exploring ES6 :
Zarządzanie pojedynczymi elementami:
> let set = new Set();
> set.add('red')
> set.has('red')
true
> set.delete('red')
true
> set.has('red')
false
Określenie rozmiaru zestawu i jego wyczyszczenie:
> let set = new Set();
> set.add('red')
> set.add('green')
> set.size
2
> set.clear();
> set.size
0
Chciałbym sprawdzić Exploring ES6, jeśli chcesz dowiedzieć się więcej o zestawach w JavaScript. Książkę można czytać online bezpłatnie, ale jeśli chcesz wesprzeć autora, dr. Axela Rauschmayera, możesz ją kupić za około 30 dolarów.
Jeśli chcesz teraz używać Sets i ES6, możesz użyć Babel , transpilera ES6 do ES5 i jego polyfillów.
Edycja: Od 6 czerwca 2017 większość głównych przeglądarek ma pełną obsługę zestawu w swoich najnowszych wersjach (z wyjątkiem IE 11). Oznacza to, że możesz nie potrzebować babel, jeśli nie chcesz obsługiwać starszych przeglądarek. Jeśli chcesz zobaczyć kompatybilność w różnych przeglądarkach, w tym w bieżącej przeglądarce, sprawdź tabelę kompatybilności Kangax ES6 .
EDYTOWAĆ:
Tylko wyjaśnienie dotyczące inicjalizacji. Zestawy mogą przyjmować dowolną synchroniczną iterację w swoim konstruktorze. Oznacza to, że mogą przyjmować nie tylko tablice, ale także ciągi i iteratory. Weźmy na przykład następującą tablicę i inicjalizację ciągu zestawu:
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);
Oba wyjścia tablicy i łańcucha są takie same. Zauważ, że ...set1jest to składnia rozkładu . Wydaje się, że każdy element iterowalny jest dodawany jeden po drugim do zestawu, więc ponieważ zarówno tablica, jak i łańcuch mają te same elementy, a elementy są w tej samej kolejności, zestaw jest tworzony tak samo. Inną rzeczą, na którą należy zwrócić uwagę w przypadku zestawów, jest to, że podczas iteracji po nich kolejność iteracji jest zgodna z kolejnością wstawiania elementów do zestawu. Oto przykład iteracji na zestawie:
const set1 = new Set(['a','a','b','b','c','c']);
for(const element of set1) {
console.log(element);
}
Ponieważ możesz użyć dowolnej iteracji do zainicjowania zestawu, możesz nawet użyć iteratora z funkcji generatora . Oto dwa takie przykłady inicjalizacji iteratora, które dają ten sam wynik:
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);
Funkcje generatora podane w tych przykładach można po prostu napisać tak, aby się nie powtarzały, ale jeśli funkcja generatora jest bardziej skomplikowana i jeśli poniższe elementy nie wpływają zbyt negatywnie na wydajność, można użyć metody Set, aby pomóc uzyskać tylko wartości z generatora, który nie nie powtarzam.
Jeśli chcesz dowiedzieć się więcej o zestawach bez czytania rozdziału jego książki doktora Rauschmayera, zajrzyj do dokumentacji MDN na Set . MDN również więcej przykładów iteracji przez zestaw takich jak używanie forEachi stosowania .keys, .valuesi .entriesmetod. MDN zawiera również przykłady, takie jak suma zestawów, przecięcie zestawów, różnica zestawów, symetryczna różnica między zbiorami i sprawdzanie nadzbiorów. Miejmy nadzieję, że większość tych operacji będzie dostępna w JavaScript bez konieczności budowania własnych funkcji, które je obsługują. W rzeczywistości istnieje ta propozycja TC39 dla nowych metod Set, która, miejmy nadzieję, powinna dodać następujące metody do Set in JavaScript w pewnym momencie w przyszłości, jeśli propozycja osiągnie etap 4:
- Set.prototype.intersection (iterable) - metoda tworzy nową instancję Set poprzez operację set intersection.
- Set.prototype.union (iterable) - metoda tworzy nową instancję Set poprzez operację set union.
- Set.prototype.difference (iterable) - metoda tworzy nowy Set bez elementów obecnych w iterable.
- Set.prototype.symmetricDifference (iterable) - zwraca zestaw elementów znalezionych tylko w this lub w iterowalnym.
- Set.prototype.isSubsetOf (iterowalne)
- Set.prototype.isDisjointFrom (iterowalne)
- Set.prototype.isSupersetOf (iterowalne)
'Tom' in setma wyglądać prawda? Wygląda na to, że masz błędne założenia na temat czegoś , a ja próbuję się dowiedzieć, o czym .