Veuillez voir la réponse de nils en utilisantObject.entries
et / ou la réponse de bergi en utilisant une fonction de générateur . Bien que Object.entries
n'étant pas encore dans les spécifications lorsque la question a été posée, elle était à l'étape 4 , donc sûr à polyfill et à utiliser même en avril 2016 (juste). (Plus d'informations sur les étapes ici .) Et les fonctions du générateur étaient dans ES2015. L'OP a spécifiquement demandé d'éviter les intermédiaires, et bien que le générateur n'évite pas complètement cela, il fait un meilleur travail que le ci-dessous ou (légèrement) Object.enties
.
FWIW, en utilisant Object.entries
:
- Crée un tableau de
[name, value]
tableaux à passernew Map
- Le
Map
constructeur appelle une fonction sur le tableau pour obtenir un itérateur; le tableau crée et renvoie un objet interateur de tableau.
- Le
Map
constructeur utilise cet objet itérateur pour obtenir les entrées (les [name, value]
tableaux) et construire la carte
Utilisation du générateur:
- Crée un objet générateur à la suite de l'appel de la fonction générateur
- Le
Map
constructeur appelle une fonction sur cet objet générateur pour en obtenir un itérateur; le rendement de l' objet générateur lui - même
- Le
Map
constructeur utilise l'objet générateur (comme itérateur) pour récupérer les entrées (les [name, value]
tableaux) et construire la carte
Donc: un intermédiaire en moins (le tableau de Object.entries
).
Cependant, l'utilisation Object.entries
est plus simple et la création de ce tableau n'est pas un problème 99,999% du temps. Alors vraiment, l'un ou l'autre. Mais ils sont tous les deux meilleurs que ceux ci-dessous. :-)
Réponse originale:
Pour initialiser a Map
, vous pouvez utiliser n'importe quel itérateur qui renvoie des paires clé / valeur sous forme de tableaux, comme un tableau de tableaux:
const map = new Map([
['foo', 'bar']
]);
Il n'y a pas de conversion intégrée d'objet en carte, mais c'est facile à faire avec Object.keys
:
const map = new Map();
let obj = {foo: 'bar'};
Object.keys(obj).forEach(key => {
map.set(key, obj[key]);
});
Vous pouvez, bien sûr, vous donner une fonction de travailleur pour gérer cela:
function buildMap(obj) {
let map = new Map();
Object.keys(obj).forEach(key => {
map.set(key, obj[key]);
});
return map;
}
ensuite
const map = buildMap({foo: 'bar'});
Ou voici une version plus l33t (est-ce toujours une chose?):
function buildMap(obj) {
return Object.keys(obj).reduce((map, key) => map.set(key, obj[key]), new Map());
}
(Oui, Map#set
renvoie la référence de la carte. Certains diront qu'il s'agit d'un abus de reduce
.)
Ou nous pouvons vraiment exagérer sur l'obscurité:
const buildMap = o => Object.keys(o).reduce((m, k) => m.set(k, o[k]), new Map());
Non, je ne ferais jamais ça pour de vrai. :-)
Object.entries
est vraiment la meilleure approcheObject.keys
, et l'approche de la fonction de générateur de bergi est légèrement plus directe que soitObject.keys
ouObject.entries
.