Por favor, veja a resposta de nils usandoObject.entries
e / ou a resposta de bergi usando uma função de gerador . Embora Object.entries
ainda não estivesse nas especificações quando a pergunta foi feita, estava no estágio 4 , portanto, seguro para polyfill e uso em abril de 2016 (apenas). (Mais sobre os estágios aqui .) E as funções do gerador estavam no ES2015. O OP pediu especificamente para evitar intermediários e, embora o gerador não evite completamente isso, ele faz um trabalho melhor do que o abaixo ou (ligeiramente) Object.enties
.
FWIW, usando Object.entries
:
- Cria uma matriz de
[name, value]
matrizes para passar paranew Map
- O
Map
construtor chama uma função na matriz para obter um iterador; a matriz cria e retorna um objeto interator de matriz.
- O
Map
construtor usa esse objeto iterador para obter as entradas (os [name, value]
arrays) e construir o mapa
Usando o gerador:
- Cria um objeto gerador como resultado da chamada da função do gerador
- O
Map
construtor chama uma função nesse objeto gerador para obter um iterador dele; o objeto gerador retorna a si mesmo
- O
Map
construtor usa o objeto gerador (como um iterador) para obter as entradas (os [name, value]
arrays) e construir o mapa
Portanto: Um intermediário a menos (a matriz de Object.entries
).
No entanto, usar Object.entries
é mais simples e criar essa matriz não é um problema 99,999% do tempo. Então, realmente, qualquer um. Mas ambos são melhores do que os de baixo. :-)
Resposta original:
Para inicializar um Map
, você pode usar qualquer iterador que retorne pares de chave / valor como matrizes, como uma matriz de matrizes:
const map = new Map([
['foo', 'bar']
]);
Não há conversão integrada de objeto em mapa, mas é facilmente feita com Object.keys
:
const map = new Map();
let obj = {foo: 'bar'};
Object.keys(obj).forEach(key => {
map.set(key, obj[key]);
});
Você pode, é claro, atribuir a si mesmo uma função de trabalhador para cuidar disso:
function buildMap(obj) {
let map = new Map();
Object.keys(obj).forEach(key => {
map.set(key, obj[key]);
});
return map;
}
Então
const map = buildMap({foo: 'bar'});
Ou aqui está uma versão mais l33t (isso ainda é uma coisa?):
function buildMap(obj) {
return Object.keys(obj).reduce((map, key) => map.set(key, obj[key]), new Map());
}
(Sim, Map#set
retorna a referência do mapa. Alguns diriam que isso é um abuso de reduce
.)
Ou podemos realmente exagerar na obscuridade:
const buildMap = o => Object.keys(o).reduce((m, k) => m.set(k, o[k]), new Map());
Não, eu nunca faria isso de verdade. :-)
Object.entries
realmente é a melhor abordagemObject.keys
, e a abordagem da função geradora de bergi é ligeiramente mais direta do queObject.keys
ouObject.entries
.