Kolekcje z kluczem

Do przechowywania par klucz-wartość możesz używać literałów obiektów oraz tablic iteracyjne zbiory wartości. ES6 wprowadza również specjalistyczne struktury danych dla bardziej szczegółowych przypadków użycia: mapuj dla par klucz-wartość, a ustaw poszczególnych wartości.

Mapa to powtarzalna struktura danych, w której informacje są przechowywane w postaci par klucz-wartość, podobnie jak literał obiektu. W przeciwieństwie do literałów obiektów mapa dopuszcza obie wartości i kluczy, które mają dowolny typ danych, a elementy kolejności dodawane do mapy są podczas iteracji.

Aby utworzyć mapę, użyj konstruktora Map():

const myMap = new Map();

myMap;
> Map(0)

Możesz wstępnie wypełnić mapę danymi przy użyciu składni przypominającej tablicę (lub obiektu iteratora) zawierającego obiektów tablicowych, które składają się z 2 elementów. Pierwszym elementem każdego z tych elementów dwuelementowe struktury danych stają się kluczem, a drugi staje się wartością powiązane z tym kluczem. Najprostszą postacią tego rozwiązania jest tablica w argumencie w którym każdy z elementów jest tablicą złożoną z 2 elementów: klucza i elementu wartość elementu, który ma zostać dodany do mapy:

const myMap = new Map([
    [ "myKey", "A string value" ],
    [ "mySecondKey", 500 ],
    [ "myThirdKey", true ]
]);

myMap;
> Map(3) {'myKey' => 'A string value', 'mySecondKey' => 500, 'myThirdKey' => true}

Obiekt Map różni się od literału obiektu tym, że obie wartości A klucze mogą przyjmować dowolne typy i wartości:

const notAFunction = () => console.log( "function" );
const myMap = new Map([
  [ null, 0 ],
  [ false, "This is false" ],
  [ undefined, "No defined value" ],
  [ NaN, "Not a number" ]
]);

myMap;
> Map(4) {null => 0, false => 'This is false', undefined => 'No defined value', NaN => 'Not a number'}

Aby pobrać, ustawić lub usunąć elementy mapy, użyj metod odziedziczonych z Map konstruktor:

const myMap = new Map();

myMap;
> Map(0)

myMap.set( "myKey", "My value." );

myMap.has( "myKey" );
> true

myMap.get( "myKey" );
"My value."

myMap.delete( "myKey" );

myMap;
> Map(0)

Klawisze w mapie są unikalne, co oznacza, że ustawienie identycznego klucza powoduje zastąpienie wcześniej przechowywana para klucz-wartość:

const myMap = new Map([ [ "myKey", "A string value" ] ]);

myMap.set( "myKey", 500 );

myMap;
> Map(1) {'myKey' => 500}

Tak jak w przypadku obiektów, możesz przypisać mapę do zmiennej zadeklarowanej za pomocą parametrów const i a potem ją zmodyfikować. Jednak, podobnie jak w innych przypadkach użycia funkcji const, nie możesz zmień lub usuń samą zmienną:

const myMap = new Map();
myMap.set( "myKey", "A string value" );

myMap;
> Map(1) {'myKey' => 500}

WeakMap

WeakMap to mapa zawierająca „słabe” pliki referencyjne, które muszą być odwołaniami do obiektów lub symboli. które nie zostały dodane do globalnego rejestru symboli.

Aby utworzyć mapę WeakMap, użyj konstruktora WeakMap():

const myWeakMap = new WeakMap();

myWeakMap;
> WeakMap(0)

Składnia WeakMap jest podobna do Mapa, ale WeakMap nie jest iterable i próbują użyć funkcji każda wartość inna niż obiekt lub symbol jako klucz powoduje błąd składni. Jeśli nie istnieją odwołania do klucza. poza WeakMap, ten obiekt lub symbol oraz powiązaną wartość w polu WeakMap – oba te typy kwalifikują się do odśmiecania.

Pozwala to na przykład na przechowywanie metadanych powiązanych z obiektem w WeakMap z użyciem odwołania do obiektu jako klucza. Jeśli nie ma innych odwołań dla tego obiektu i zostanie on usunięty z pamięci, metadane też są usuwane.

Ustaw

Zbiór to powtarzalny zbiór unikalnych wartości, który jest w pewnym stopniu podobny do tablicy, chociaż zestaw może zawierać tylko unikalne wartości. Podobnie jak w przypadku mapy, iteracja w oparciu o Zestaw zachowuje kolejność dodanych do niego elementów.

Aby utworzyć zbiór, użyj konstruktora Set():

const mySet = new Set();

mySet;
> Set []

Możesz też utworzyć zbiór z literału tablicowego:

const mySet = new Set([ 1, 2, 3 ]);

mySet;
> Set(3) [ 1, 2, 3 ]

Zestaw nie zezwala na zduplikowane elementy, więc gdy zostanie utworzony na podstawie tablica zawiera wiele wystąpień tej samej wartości, zachowuje tylko pierwsze z nich wystąpienie tej wartości:

const mySet = new Set([ 1, 2, 3, 2 ]);

mySet;
> Set(3) [ 1, 2, 3 ]

Aby dodać elementy do zestawu lub je z niego usunąć, użyj metod odziedziczonych z Set za pomocą konstruktora. Te metody działają na elemencie na podstawie jego wartości własnoręcznie, zamiast odwoływać się do indeksu:

const mySet = new Set();

mySet.add( "My value." );

mySet;
> Set [ "My value." ]

mySet.has( "My value." );
> true

mySet.delete( "My value." );

mySet;
> Set []

Chociaż zbiory nie są zindeksowane, i nie powinny być używane Oznacza to, że elementy zestawu są iteracyjnie w kolejności ich umieszczenia. Próby dodania zduplikowanej wartości elementu do zestawu są następujące: pominięto przy zachowaniu pierwotnego zamówienia reklamowego:

const mySet = new Set([ 1, 2, 3 ]);

mySet;
> Set(3) [ 1, 2, 3 ]

mySet.add( 2 );
> Set(3) [ 1, 2, 3 ]

Aby utworzyć tablicę ze zbioru, użyj metody Array.from() lub rozkładu składnia:

const mySet = new Set([ 1, 2, 3 ]);
const myArray = Array.from( mySet );

myArray;
> Array(3) [ 1, 2, 3 ]

[ ...mySet ];
> Array(3) [ 1, 2, 3 ]

WeakSet

WeakSet to zestaw, który zawiera tylko wartości możliwe do odśmiecania, na przykład odniesienia do obiektów lub symboli; które nie zostały dodane do globalnego rejestru symboli.

Aby utworzyć zbiór danych WeakSet, użyj konstruktora WeakSet():

const myWeakSet = new WeakSet();

myWeakSet;
> WeakSet []

Składnia WeakSet jest podobna do składni Set, chociaż iterable i próbujesz dodać każda wartość inna niż obiekt lub symbol powoduje błąd składni. Podobnie jak w przypadku WeakMap, gdy żadne inne odwołania do wartość, do której odwołuje się WeakSet, będzie kwalifikowała się do odśmiecania.

Pozwala to na przykład na agregowanie pojedynczej, powtarzalnej kolekcji powiązane obiekty. Jeśli nie ma innych odwołań do obiektu, do którego odwołuje się klucz WeakSet, powiązany element jest także usuwany z zestawu WeakSet.

Sprawdź swoją wiedzę

Biorąc pod uwagę te kwestie:

        const myMap = new Map([ [ "myKey", "My string" ] ]);
        myMap.set( "myKey", 100 );
      

Co zwraca myMap?

"My string"
undefined
100