Zobacz odpowiedź nilsa przy użyciuObject.entries i / lub odpowiedź Bergi za pomocą funkcji generatora . Chociaż Object.entriesnie 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
MapKonstruktor wywołuje funkcję na tablicy, aby uzyskać iterator; tablica tworzy i zwraca obiekt pośredniczący tablicy.
- Do
Mapzastosowania 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
MapKonstruktor wywołuje funkcję na tym obiekcie generatora dostać iterator od niego; obiekt generatora zwraca sam siebie
MapKonstruktor 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.entriesjest 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#setzwraca 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.entriesnaprawdę jest lepszym podejściemObject.keys, a podejście do funkcji generatora Bergi jest nieco bardziej bezpośrednie niż alboObject.keysalboObject.entries.