Vea la respuesta de nils usandoObject.entries
y / o la respuesta de bergi usando una función generadora . Aunque aún Object.entries
no estaba en la especificación cuando se hizo la pregunta, estaba en la Etapa 4 , por lo que es seguro para rellenar y usar incluso en abril de 2016 (solo). (Más sobre las etapas aquí .) Y las funciones del generador estaban en ES2015. El OP pidió específicamente evitar intermediarios, y aunque el generador no lo evita por completo, hace un mejor trabajo que el siguiente o (ligeramente) Object.enties
.
FWIW, usando Object.entries
:
- Crea una matriz de
[name, value]
matrices para pasar anew Map
- El
Map
constructor llama a una función en la matriz para obtener un iterador; la matriz crea y devuelve un objeto interador de matriz.
- El
Map
constructor usa ese objeto iterador para obtener las entradas (las [name, value]
matrices) y construir el mapa
Usando el generador:
- Crea un objeto generador como resultado de llamar a la función del generador
- El
Map
constructor llama a una función en ese objeto generador para obtener un iterador de él; el objeto generador se devuelve a sí mismo
- El
Map
constructor usa el objeto generador (como iterador) para obtener las entradas (las [name, value]
matrices) y construir el mapa
Entonces: Un intermediario menos (la matriz de Object.entries
).
Sin embargo, usar Object.entries
es más simple y crear esa matriz no es un problema el 99,999% de las veces. Entonces realmente, cualquiera. Pero ambos son mejores que los siguientes. :-)
Respuesta original:
Para inicializar a Map
, puede utilizar cualquier iterador que devuelva pares clave / valor como matrices, como una matriz de matrices:
const map = new Map([
['foo', 'bar']
]);
No hay conversión incorporada de objeto a mapa, pero se hace fácilmente con Object.keys
:
const map = new Map();
let obj = {foo: 'bar'};
Object.keys(obj).forEach(key => {
map.set(key, obj[key]);
});
Por supuesto, puedes darte una función de trabajador para manejar eso:
function buildMap(obj) {
let map = new Map();
Object.keys(obj).forEach(key => {
map.set(key, obj[key]);
});
return map;
}
Luego
const map = buildMap({foo: 'bar'});
O aquí hay una versión más l33t (¿sigue siendo una cosa?):
function buildMap(obj) {
return Object.keys(obj).reduce((map, key) => map.set(key, obj[key]), new Map());
}
(Sí, Map#set
devuelve la referencia del mapa. Algunos dirían que se trata de un abuso de reduce
).
O realmente podemos exagerar en la oscuridad:
const buildMap = o => Object.keys(o).reduce((m, k) => m.set(k, o[k]), new Map());
No, nunca haría eso de verdad. :-)
Object.entries
realmente es el mejor enfoqueObject.keys
, y el enfoque de función del generador de bergi es un poco más directo queObject.keys
oObject.entries
.