Si prega di vedere la risposta di nils utilizzandoObject.entries e / o la risposta di bergi utilizzando una funzione generatore . Sebbene Object.entriesnon fosse ancora nelle specifiche quando è stata posta la domanda, era allo stadio 4 , quindi sicuro da usare con polyfill anche nell'aprile 2016 (solo). (Maggiori informazioni sulle fasi qui .) E le funzioni del generatore erano in ES2015. L'OP ha chiesto espressamente di evitare intermediari e, sebbene il generatore non lo eviti completamente, fa un lavoro migliore rispetto a quelli sotto o (leggermente) Object.enties.
FWIW, utilizzando Object.entries:
- Crea un array di
[name, value]array a cui passarenew Map
- Il
Mapcostruttore chiama una funzione sull'array per ottenere un iteratore; l'array crea e restituisce un oggetto interator dell'array.
- Il
Mapcostruttore usa quell'oggetto iteratore per ottenere le voci (gli [name, value]array) e costruire la mappa
Utilizzando il generatore:
- Crea un oggetto generatore come risultato della chiamata della funzione generatore
- Il
Mapcostruttore chiama una funzione su quell'oggetto generatore per ottenere un iteratore da esso; l'oggetto generatore ritorna da solo
- Il
Mapcostruttore usa l'oggetto generatore (come iteratore) per ottenere le voci (gli [name, value]array) e costruire la mappa
Quindi: un intermediario in meno (l'array da Object.entries).
Tuttavia, l'utilizzo Object.entriesè più semplice e la creazione di quell'array non è un problema il 99,999% delle volte. Quindi davvero, nessuno dei due. Ma sono entrambi migliori dei seguenti. :-)
Risposta originale:
Per inizializzare a Map, puoi utilizzare qualsiasi iteratore che restituisca coppie chiave / valore come array, ad esempio un array di array:
const map = new Map([
['foo', 'bar']
]);
Non esiste una conversione incorporata da oggetto a mappa, ma è facilmente realizzabile con Object.keys:
const map = new Map();
let obj = {foo: 'bar'};
Object.keys(obj).forEach(key => {
map.set(key, obj[key]);
});
Puoi, ovviamente, darti una funzione di lavoro per gestirlo:
function buildMap(obj) {
let map = new Map();
Object.keys(obj).forEach(key => {
map.set(key, obj[key]);
});
return map;
}
Poi
const map = buildMap({foo: 'bar'});
Oppure ecco una versione più l33t (è ancora una cosa?):
function buildMap(obj) {
return Object.keys(obj).reduce((map, key) => map.set(key, obj[key]), new Map());
}
(Sì, Map#setrestituisce il riferimento della mappa. Alcuni sostengono che si tratta di un abuso di reduce.)
Oppure possiamo davvero esagerare con l'oscurità:
const buildMap = o => Object.keys(o).reduce((m, k) => m.set(k, o[k]), new Map());
No, non lo farei mai per davvero. :-)
Object.entriesè davvero l'approccio miglioreObject.keys, e l'approccio alla funzione del generatore di bergi è leggermente più diretto diObject.keysoObject.entries.