Szukaj…
Wprowadzenie
Obiekt Set pozwala przechowywać unikalne wartości dowolnego typu, zarówno pierwotne, jak i referencje do obiektów.
Obiekty ustawione to zbiory wartości. Możesz iterować elementy zestawu w kolejności wstawiania. Wartość w zestawie może wystąpić tylko RAZ ; jest wyjątkowy w kolekcji zestawu. Odrębne wartości są rozróżniane przy użyciu algorytmu porównania SameValueZero .
Składnia
- nowy zestaw ([iterowalny])
- mySet.add (wartość)
- mySet.clear ()
- mySet.delete (wartość)
- mySet.entries ()
- mySet.forEach (callback [, thisArg])
- mySet.has (wartość)
- mySet.values ()
Parametry
Parametr | Detale |
---|---|
iterowalne | Jeśli obiekt iterowalny zostanie przekazany, wszystkie jego elementy zostaną dodane do nowego zestawu. wartość null jest traktowana jako niezdefiniowana. |
wartość | Wartość elementu do dodania do obiektu Set. |
oddzwonić | Funkcja do wykonania dla każdego elementu. |
thisArg | Opcjonalny. Wartość, której należy użyć podczas wykonywania wywołania zwrotnego. |
Uwagi
Ponieważ każda wartość w zestawie musi być unikalna, równość wartości zostanie sprawdzona i nie będzie oparta na tym samym algorytmie, który zastosowano w operatorze ===. W szczególności dla zestawów +0 (co jest ściśle równe -0) i -0 są różnymi wartościami. Zostało to jednak zmienione w najnowszej specyfikacji ECMAScript 6. Począwszy od Gecko 29.0 (Firefox 29 / Thunderbird 29 / SeaMonkey 2.26) (błąd 952870) i najnowszego nocnego Chrome, +0 i -0 są traktowane jako te same wartości w obiektach Set. NaN i niezdefiniowane mogą być również przechowywane w zestawie. NaN jest uważany za taki sam jak NaN (chociaż NaN! == NaN).
Tworzenie zestawu
Obiekt Set pozwala przechowywać unikalne wartości dowolnego typu, zarówno pierwotne, jak i referencje do obiektów.
Możesz wypychać elementy do zestawu i iterować je podobnie do zwykłej tablicy JavaScript, ale w przeciwieństwie do tablicy, nie możesz dodać wartości do zestawu, jeśli wartość już w nim istnieje.
Aby utworzyć nowy zestaw:
const mySet = new Set();
Lub możesz utworzyć zestaw z dowolnego obiektu iterowalnego, aby nadać mu wartości początkowe:
const arr = [1,2,3,4,4,5];
const mySet = new Set(arr);
W powyższym przykładzie ustawiona zawartość to {1, 2, 3, 4, 5}
. Zauważ, że wartość 4 pojawia się tylko raz, w przeciwieństwie do oryginalnej tablicy użytej do jej utworzenia.
Dodawanie wartości do zestawu
Aby dodać wartość do zestawu, użyj metody .add()
:
mySet.add(5);
Jeśli wartość już istnieje w zestawie, nie zostanie dodana ponownie, ponieważ zestawy zawierają unikalne wartości.
Zauważ, że metoda .add()
zwraca sam zestaw, dzięki czemu możesz łączyć ze sobą połączenia:
mySet.add(1).add(2).add(3);
Usuwanie wartości z zestawu
Aby usunąć wartość z zestawu, użyj metody .delete()
:
mySet.delete(some_val);
Ta funkcja zwróci true
jeśli wartość istniała w zestawie i została usunięta, lub false
przeciwnym razie.
Sprawdzanie, czy wartość istnieje w zestawie
Aby sprawdzić, czy dana wartość istnieje w zestawie, użyj metody .has()
:
mySet.has(someVal);
someVal
true
jeśli someVal
pojawi się w zestawie, false
przeciwnym razie.
Czyszczenie zestawu
Możesz usunąć wszystkie elementy w zestawie za pomocą metody .clear()
:
mySet.clear();
Pierwsze ustaloną długość
Możesz uzyskać liczbę elementów w zestawie za pomocą właściwości .size
const mySet = new Set([1, 2, 2, 3]);
mySet.add(4);
mySet.size; // 4
Ta właściwość, w przeciwieństwie do Array.prototype.length
, jest tylko do odczytu, co oznacza, że nie można jej zmienić, przypisując do niej coś:
mySet.size = 5;
mySet.size; // 4
W trybie ścisłym generuje nawet błąd:
TypeError: Cannot set property size of #<Set> which has only a getter
Konwertowanie zestawów na tablice
Czasami konieczne może być przekonwertowanie zestawu na tablicę, na przykład w celu użycia metod Array.prototype
, takich jak .filter()
. Aby to zrobić, użyj Array.from()
lub destructuring-assignment
:
var mySet = new Set([1, 2, 3, 4]);
//use Array.from
const myArray = Array.from(mySet);
//use destructuring-assignment
const myArray = [...mySet];
Teraz możesz przefiltrować tablicę, aby zawierała tylko liczby parzyste i przekonwertować ją z powrotem na Set za pomocą konstruktora Set:
mySet = new Set(myArray.filter(x => x % 2 === 0));
mySet
zawiera teraz tylko liczby parzyste:
console.log(mySet); // Set {2, 4}
Przecięcie i różnica w zestawach
Nie ma wbudowanych metod przecinania i różnic w zestawach, ale nadal można to osiągnąć, ale konwertując je na tablice, filtrując i przekształcając z powrotem do zestawów:
var set1 = new Set([1, 2, 3, 4]),
set2 = new Set([3, 4, 5, 6]);
const intersection = new Set(Array.from(set1).filter(x => set2.has(x)));//Set {3, 4}
const difference = new Set(Array.from(set1).filter(x => !set2.has(x))); //Set {1, 2}
Zestawy iteracyjne
Możesz użyć prostej pętli for do iteracji zestawu:
const mySet = new Set([1, 2, 3]);
for (const value of mySet) {
console.log(value); // logs 1, 2 and 3
}
Podczas iteracji nad zestawem zawsze zwraca wartości w kolejności, w jakiej zostały po raz pierwszy dodane do zestawu. Na przykład:
const set = new Set([4, 5, 6])
set.add(10)
set.add(5) //5 already exists in the set
Array.from(set) //[4, 5, 6, 10]
Istnieje również metoda .forEach()
, podobna do Array.prototype.forEach()
. Ma dwa parametry, callback
, które zostanie wykonane dla każdego elementu, i opcjonalnie thisArg
, który będzie używany jako this
podczas wykonywania callback
.
callback
ma trzy argumenty. Pierwsze dwa argumenty są zarówno bieżącym elementem zestawu (dla spójności z Array.prototype.forEach()
i Map.prototype.forEach()
), a trzecim argumentem jest sam zestaw.
mySet.forEach((value, value2, set) => console.log(value)); // logs 1, 2 and 3