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 ...set1
jest 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 forEach
i stosowania .keys
, .values
i .entries
metod. 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 set
ma 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 .