Używaj map na obiektach, gdy klucze są nieznane do czasu wykonania oraz gdy wszystkie klucze są tego samego typu i wszystkie wartości są tego samego typu.
Używaj obiektów, gdy istnieje logika działająca na poszczególnych elementach.
Pytanie:
Jaki jest odpowiedni przykład użycia Map nad obiektami? w szczególności „kiedy klucze byłyby nieznane do czasu wykonania?”
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));
javascript
ecmascript-6
javascript-objects
Matthew Harwood
źródło
źródło
WeakMap
może to być również pomocne.name
iid
na przykład.Odpowiedzi:
Myślę, że podałeś już jeden dobry przykład: musisz przynajmniej użyć
Map
s, kiedy używasz obiektów (w tym obiektów Function) jako kluczy.Zawsze, gdy nie są znane w czasie kompilacji. Krótko mówiąc, zawsze powinieneś używać a,
Map
gdy potrzebujesz kolekcji klucz-wartość . Dobrym wskaźnikiem, że potrzebujesz kolekcji, jest dynamiczne dodawanie i usuwanie wartości z kolekcji, a zwłaszcza gdy nie znasz tych wartości wcześniej (np. Są odczytywane z bazy danych, wprowadzane przez użytkownika itp.).Z kolei obiektów należy używać, gdy wiadomo, jakie i ile właściwości ma obiekt podczas pisania kodu - gdy ich kształt jest statyczny. Jak to ujął @Felix: kiedy potrzebujesz rekordu . Dobrym wskaźnikiem potrzeby jest to, że pola mają różne typy i kiedy nigdy nie musisz używać notacji w nawiasach (lub spodziewasz się ograniczonego zestawu nazw właściwości).
źródło
for..of
) Zamiast na poziomie programu (np.for..in
) UżyjMap
. Więcej informacji na temat tych warunków w tej odpowiedzi .Myślę, że z ES2015
Map
pozostały tylko dwa powody, aby używać zwykłych obiektów:Kiedy porządek nieruchomości nie ma znaczenia?
Promise
- który jest proxy dla przyszłej wartości - ithen
/catch
)We wszystkich innych przypadkach możesz rozważyć użycie
Map
, ponieważ zachowuje porządek właściwości i oddziela program (wszystkie właściwości przypisane doMap
obiektu) od poziomu danych (wszystkie wpisy w nimMap
samym).Jakie są wady
Map
?źródło
Map
jest prawdopodobnie szybszy, ponieważ opiera się wyłącznie na mieszaniu, aleObject
jest nieco bardziej skomplikowany. Dzięki!Nie mam pojęcia, dlaczego ktoś napisałby 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 używania map jest potrzeba kluczy z wartościami obiektowymi. Pomysł, że wartości powinny być tego samego typu, jest absurdalny - choć oczywiście mogą być. Pomysł, że nie powinno się używać obiektów, gdy klucze są nieznane do czasu wykonania, jest równie absurdalny.
źródło
Map
są dostępne) to dobra rada.Jedną z różnic między
Map
iObject
jest:Map
może używać złożonego typu danych jako klucza. lubię to:const fn = function() {} const m = new Map([[document.body, 'stackoverflow'], [fn, 'redis']]); m.get(document.body) // 'stackoverflow' m.get(fn) //'redis'
uwaga: w przypadku złożonego typu danych, jeśli chcesz uzyskać wartość, musisz przekazać to samo odwołanie co klucz.
Object
, jako klucz przyjmuje tylko prosty typ danych (number
,string
).const a = {}; a[document.body] = 'stackoverflow'; console.log(a) //{[object HTMLBodyElement]: "stackoverflow"}
źródło
Object
s są podobne doMap
s w tym sensie, że oba umożliwiają ustawianie kluczy na wartości, pobieranie tych wartości, usuwanie kluczy i wykrywanie, czy coś jest przechowywane w kluczu. Z tego powodu (i ponieważ nie było wbudowanych alternatyw),Object
s były używane jakoMap
s w przeszłości; jednak istnieją istotne różnice, które sprawiają, żeMap
w niektórych przypadkach preferowane jest użycie :Object
toString
s iSymbol
s, podczas gdy mogą to być dowolne wartości aMap
, w tym funkcje, obiekty i dowolny prymityw.Map
są uporządkowane, a klucze dodane do obiektu nie. Tak więc podczas iteracjiMap
obiekt zwraca klucze w kolejności wstawiania.Map
za pomocąsize
właściwości, podczas gdy liczbę nieruchomości w jednymObject
należy określić ręcznie.Map
jest iterowalny i dlatego może być bezpośrednio iterowany, podczas gdy iterowanie po nimObject
wymaga uzyskania jego kluczy w pewien sposób i iteracji po nich.Object
ma prototyp, więc na mapie znajdują się domyślne klucze, które mogą kolidować z twoimi kluczami, jeśli nie będziesz ostrożny. Od wersji ES5 można to ominąć za pomocąmap = Object.create(null)
, ale rzadko się to robi.Map
może działać lepiej w scenariuszach obejmujących częste dodawanie i usuwanie par kluczy.MDN
źródło
To pytanie jest duplikatem ale dopóki nie zostanie zamknięty, oto moja odpowiedź stamtąd :
Oprócz innych odpowiedzi odkryłem, że Mapy są bardziej nieporęczne i bardziej szczegółowe 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 bezpośrednio wyrazisty i lepiej trzymany w głowie programisty .
Kolejny aspekt: ponieważ set () zwraca mapę, a nie wartość, nie można łączyć przypisań w łańcuch.
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 właściwie zobaczyć, jakie klucze znajdują się na mapie. Aby to zrobić, musiałbyś napisać kod.
Obiekty mogą być oceniane przez dowolne IDE:
źródło