Mapy vs obiekty w ES6, kiedy używać?

Ref: MDN Maps

Używaj map nad obiektami, gdy klawisze są nieznane do czasu uruchomienia, a gdy wszystkie klucze są tego samego typu i wszystkie wartości są tego samego typu.

Używaj obiektów, gdy istnieje logika, która działa na poszczególnych elementach.

Pytanie:

Jaki jest przykład wykorzystania map nad obiektami? w szczególności, " kiedy klucze będą nieznane do czasu uruchomienia?"

var myMap = new Map();

var keyObj = {},
    keyFunc = function () { return 'hey'},
    keyString = "a string";

// setting the values
myMap.set(keyString, "value associated with 'a string'");
myMap.set(keyObj, "value associated with keyObj");
myMap.set(keyFunc, "value associated with keyFunc");

console.log(myMap.get(keyFunc));
Author: Matthew Harwood, 2015-09-16

5 answers

Jaki jest przykład użycia map nad obiektami?

Myślę, że podałeś już jeden dobry przykład: musisz przynajmniej używać Map s, gdy używasz obiektów (w tym obiektów funkcyjnych) jako kluczy.

W szczególności, " kiedy klucze będą nieznane do czasu uruchomienia?"

Gdy nie są znane w czasie kompilacji. W skrócie, powinieneś zawsze używać Map, gdy potrzebujesz kolekcji key-value . Dobrym wskaźnikiem, że potrzebujesz kolekcji, gdy dodajesz i usuwasz wartości dynamicznie z kolekcji, a zwłaszcza gdy nie znasz tych wartości wcześniej (np. są one odczytywane z bazy danych, wprowadzane przez użytkownika, itp.).

W przeciwieństwie do tego, powinieneś używać obiektów, gdy wiesz, które i ile właściwości ma obiekt podczas pisania kodu - gdy ich kształt jest statyczny. Jak to ujął @ Felix: kiedy potrzebujesz rekord. Dobrym wskaźnikiem potrzeby jest to, gdy pola mają różne typów i gdy nie trzeba używać notacji nawiasowej (lub oczekiwać w niej ograniczonego zestawu nazw właściwości).

 38
Author: Bergi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-16 12:01:28

Myślę, że z ES2015 ' s Map zostały tylko dwa powody, aby używać zwykłych obiektów:

Kiedy zamówienie nieruchomości jest nieważne?

  • Jeśli masz tylko jedną wartość i niektóre funkcje, które powinny być z nią bezpośrednio powiązane (np. Promise - czyli proxy dla przyszłej wartości-i then/catch)
  • Jeśli masz strukturę danych podobną do struktury struct / record ze statycznym zestawem właściwości znanych w czasie kompilacji (Zwykle struktury/rekordy nie są iterowalne)

We wszystkich innych przypadkach można rozważyć użycie Map, ponieważ zachowuje kolejność właściwości i oddziela program (wszystkie właściwości przypisane do obiektu Map) od poziomu danych (wszystkie wpisy w samym Map).

Jakie są wady Map?

  • tracisz zwięzłą składnię obiektu
  • potrzebujesz niestandardowych zamienników dla JSON.stringyfy
  • tracisz destrukcję, co i tak jest bardziej przydatne przy statycznych strukturach danych
 20
Author: ftor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-23 16:42:33

Używaj map nad obiektami, gdy klucze są nieznane do czasu uruchomienia, a wszystkie klucze są tego samego typu i wszystkie wartości są tego samego typu.

Nie mam pojęcia, dlaczego ktoś mógłby napisać coś tak ewidentnie błędnego. Muszę powiedzieć, że w dzisiejszych czasach ludzie znajdują coraz więcej błędnych i/lub wątpliwych treści na MDN. Nic w tym zdaniu nie jest poprawne. Głównym powodem korzystania z map jest potrzeba kluczy o wartości obiektowej. Ideą, że wartości powinny być tego samego typu jest absurdalne, choć oczywiście mogą być. Równie absurdalna jest idea, że nie należy używać obiektów, gdy klucze są nieznane do czasu uruchomienia.
 9
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-16 09:47:24

To pytanie jest duplikatem ale dopóki nie zostanie zamknięte, oto moja odpowiedź stamtąd :

Oprócz innych odpowiedzi, odkryłem, że mapy są bardziej nieporęczne i gadatliwe w obsłudze niż obiekty.

obj[key] += x
// vs.
map.set(map.get(key) + x)

Jest to ważne, ponieważ krótszy kod jest szybszy do odczytania, bardziej wyrazisty i lepiej utrzymywany w głowie programisty .

Inny aspekt: ponieważ set () zwraca mapę, a nie wartość, niemożliwe jest łańcuchowanie zadania.

foo = obj[key] = x;  // Does what you expect
foo = map.set(key, x)  // foo !== x; foo === map

Debugowanie map jest również bardziej bolesne. Poniżej nie możesz zobaczyć, jakie klucze są na mapie. Musiałbyś napisać kod, żeby to zrobić.

Powodzenia w ocenie iteratora Map

Obiekty mogą być oceniane przez dowolne IDE:

WebStorm oceniający obiekt

 2
Author: Dan Dascalescu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:10:10

Jedną z różnic między Map i Object jest:

Map może używać złożonego typu danych jako klucza. tak:

const fn = function() {}
const m = new Map([[document.body, 'stackoverflow'], [fn, 'redis']]);

m.get(document.body) // 'stackoverflow'
m.get(fn) //'redis'

Uwaga: dla złożonych typów danych, jeśli chcesz uzyskać wartość, musisz przekazać to samo odniesienie co klucz.

Object, akceptuje tylko prosty typ danych(number, string) jako klucz.

const a = {};
a[document.body] = 'stackoverflow';

console.log(a) //{[object HTMLBodyElement]: "stackoverflow"}
 2
Author: novaline,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-29 02:37:42