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 .

Standardowa specyfikacja zestawu

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


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow