Zobacz odpowiedź nilsa przy użyciuObject.entries
i / lub odpowiedź Bergi za pomocą funkcji generatora . Chociaż Object.entries
nie było jeszcze w specyfikacji, gdy zadawano pytanie, było na etapie 4 , więc można go bezpiecznie wypełnić i używać nawet w kwietniu 2016 r. (Właśnie). (Więcej o etapach tutaj .) A funkcje generatora były w ES2015. Program operacyjny wyraźnie poprosił o unikanie pośredników i chociaż generator nie unika tego całkowicie, wykonuje lepszą pracę niż poniżej lub (nieznacznie) Object.enties
.
FWIW, używając Object.entries
:
- Tworzy tablicę
[name, value]
tablic do przekazanianew Map
Map
Konstruktor wywołuje funkcję na tablicy, aby uzyskać iterator; tablica tworzy i zwraca obiekt pośredniczący tablicy.
- Do
Map
zastosowania konstruktor iterator obiektu, aby uzyskać dane (The [name, value]
tablice) i zbudować mapę
Korzystanie z generatora:
- Tworzy obiekt generatora w wyniku wywołania funkcji generatora
Map
Konstruktor wywołuje funkcję na tym obiekcie generatora dostać iterator od niego; obiekt generatora zwraca sam siebie
Map
Konstruktor używa obiektu generatora (jako iterator), aby uzyskać wpisy (te [name, value]
tablice) i zbudować mapę
A więc: o jeden pośrednik mniej (tablica z Object.entries
).
Jednak używanie Object.entries
jest prostsze, a tworzenie tej tablicy nie stanowi problemu w 99,999% przypadków. Więc naprawdę, albo jeden. Ale oba są lepsze niż poniżej. :-)
Oryginalna odpowiedź:
Aby zainicjować a Map
, możesz użyć dowolnego iteratora, który zwraca pary klucz / wartość jako tablice, takie jak tablica tablic:
const map = new Map([
['foo', 'bar']
]);
Nie ma wbudowanej konwersji z obiektu na mapę, ale można to łatwo zrobić za pomocą Object.keys
:
const map = new Map();
let obj = {foo: 'bar'};
Object.keys(obj).forEach(key => {
map.set(key, obj[key]);
});
Możesz oczywiście przypisać sobie funkcję pracownika, aby sobie z tym poradzić:
function buildMap(obj) {
let map = new Map();
Object.keys(obj).forEach(key => {
map.set(key, obj[key]);
});
return map;
}
Następnie
const map = buildMap({foo: 'bar'});
Lub tutaj jest wersja bardziej wyglądająca na l33t (czy to wciąż coś?):
function buildMap(obj) {
return Object.keys(obj).reduce((map, key) => map.set(key, obj[key]), new Map());
}
(Tak, Map#set
zwraca odniesienie mapy. Niektórzy twierdzą, że jest to abusage z reduce
).
Lub możemy naprawdę przesadzić w kwestii niejasności:
const buildMap = o => Object.keys(o).reduce((m, k) => m.set(k, o[k]), new Map());
Nie, nigdy bym tego naprawdę nie zrobił. :-)
Object.entries
naprawdę jest lepszym podejściemObject.keys
, a podejście do funkcji generatora Bergi jest nieco bardziej bezpośrednie niż alboObject.keys
alboObject.entries
.