Kolekcje z kluczem

Literów obiektu możesz używać do przechowywania par klucz-wartość, a tablic – do przechowywania możliwych do użycia zbiorów wartości. ES6 wprowadza również specjalistyczne struktury danych, aby dostosować je do bardziej szczegółowych przypadków użycia: mapowanie dla par klucz-wartość i ustawianie dla poszczególnych wartości.

Mapa

Mapa to iteracyjna struktura danych, w której informacje są przechowywane w postaci par klucz-wartość, podobne do literału obiektu. W przeciwieństwie do literałów obiektów mapa pozwala, aby zarówno wartości, jak i klucze miały dowolny typ danych, a elementy kolejności są dodawane do mapy podczas jej iteracji.

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

const myMap = new Map();

myMap;
> Map(0)

Możesz wstępnie wypełnić mapę danymi, korzystając ze składni przypominającej tablicę (lub dowolny obiekt iteratora) zawierający obiekty tablicowe złożone z 2 elementów. Pierwszy element w każdej z tych dwuelementowych struktur danych staje się kluczem, a drugi wartością powiązaną z tym kluczem. Najprostszą formą jest tablica, w której każdy element jest tablicą składającą się z 2 elementów – klucza i wartości elementu dodawanego 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 mapy różni się od literału obiektu tym, że zarówno wartości, jak i klucze, mogą przyjmować dowolny typ danych i wartość:

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 konstruktora Map:

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)

Klucze na mapie są unikalne, co oznacza, że ustawienie identycznego klucza zastępuje wcześniej zapisaną parę 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ą const, a następnie zmodyfikować tę mapę. Podobnie jak w innych przypadkach użycia właściwości const, nie możesz jednak zmieniać ani usuwać samej zmiennej:

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

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

WeakMap

WeakMap to mapa z „słabymi” references, które muszą być odwołaniami do obiektów lub symboli, które nie zostały dodane do globalnego rejestru symboli.

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

const myWeakMap = new WeakMap();

myWeakMap;
> WeakMap(0)

Składnia WeakMap jest podobna do składni Map, ale jej nie można zmieniać. Próba użycia wartości innej niż obiekt lub symbol jako klucz powoduje błąd składni. Jeśli poza WeakMap nie ma żadnych references do klucza, ten obiekt lub symbol oraz powiązana wartość w WeakMap mogą być używane do czyszczenia pamięci.

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

Ustaw

Zbiór to powtarzalny zbiór unikalnych wartości przypominających tablicę, chociaż może zawierać tylko unikalne wartości. Podobnie jak w przypadku mapy, iterowanie nad zestawem zachowuje kolejność, w jakiej zostały do niego dodane elementy.

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

const mySet = new Set();

mySet;
> Set []

Możesz też utworzyć zbiór na podstawie literału tablicy:

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

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

Ponieważ zbiór nie dopuszcza powielonych elementów, to gdy zostanie utworzony z tablicy zawierającej wiele wystąpień tej samej wartości, zachowa tylko pierwsze 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 konstruktora Set. Te metody działają na elemencie na podstawie jego wartości, a nie 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ż zestawy nie są kolekcjami indeksowanymi i nie są przeznaczone do tego celu, elementy w zestawie są powtarzane w kolejności ich wstawiania. Próby dodania zduplikowanej wartości elementu do zestawu są pomijane, co pozwala zachować pierwotne zamówienie reklamowe:

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 składni rozkładu:

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 zawierający tylko wartości przeznaczone do czyszczenia pamięci, np. odwołania do obiektów lub symboli, które nie zostały dodane do globalnego rejestru symboli.

Aby utworzyć WeakSet, użyj konstruktora WeakSet():

const myWeakSet = new WeakSet();

myWeakSet;
> WeakSet []

Składnia WeakSet jest podobna do Set, z tym jednak, że WeakSet nie jest możliwy do odczytania, a próba dodania wartości innej niż obiekt lub symbol powoduje błąd składni. Tak jak w przypadku WeakMap, jeśli nie ma innych references do wartości, do której odwołuje się WeakSet, wartość ta kwalifikuje się do czyszczenia pamięci.

Pozwala to na przypadki użycia, takie jak agregacja pojedynczego, iteracyjnego zbioru powiązanych obiektów. Jeśli nie ma innych odwołań do obiektu, do którego odwołuje się WeakSet, powiązany element też jest usuwany z WeakSet.

Sprawdź swoją wiedzę

Biorąc pod uwagę te kwestie:

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

Co zwraca myMap?

100
"My string"
undefined