Bitte sehen Sie die Antwort von nils mitObject.entries und / oder die Antwort von bergi mit einer Generatorfunktion . Obwohl Object.entrieses noch nicht in der Spezifikation enthalten war, als die Frage gestellt wurde, befand es sich in Phase 4 , so dass es bereits im April 2016 (nur) sicher gefüllt und verwendet werden konnte. (Mehr zu den Stufen hier .) Und Generatorfunktionen waren in ES2015. Das OP hat ausdrücklich darum gebeten, Vermittler zu vermeiden, und obwohl der Generator dies nicht vollständig vermeidet, leistet er einen besseren Job als der unten stehende oder (geringfügig) Object.enties.
FWIW, mit Object.entries:
- Erstellt ein Array von
[name, value]Arrays, an die übergeben werden sollnew Map
- Der
MapKonstruktor ruft eine Funktion für das Array auf, um einen Iterator abzurufen. Das Array erstellt ein Array-Interatorobjekt und gibt es zurück.
- Der
MapKonstruktor verwendet dieses Iteratorobjekt, um die Einträge (die [name, value]Arrays) abzurufen und die Karte zu erstellen
Verwenden des Generators:
- Erstellt ein Generatorobjekt als Ergebnis des Aufrufs der Generatorfunktion
- Der
MapKonstruktor ruft eine Funktion für dieses Generatorobjekt auf, um einen Iterator daraus abzurufen. Das Generatorobjekt gibt sich selbst zurück
- Der
MapKonstruktor verwendet das Generatorobjekt (als Iterator), um die Einträge (die [name, value]Arrays) abzurufen und die Karte zu erstellen
Also: Ein Vermittler weniger (das Array von Object.entries).
Die Verwendung Object.entriesist jedoch einfacher und das Erstellen dieses Arrays ist in 99,999% der Fälle kein Problem. Also wirklich, einer von beiden. Aber sie sind beide besser als die folgenden. :-)
Ursprüngliche Antwort:
Zum Initialisieren von a Mapkönnen Sie einen beliebigen Iterator verwenden, der Schlüssel / Wert-Paare als Arrays zurückgibt, z. B. ein Array von Arrays:
const map = new Map([
['foo', 'bar']
]);
Es gibt keine integrierte Konvertierung von Objekt zu Karte, aber es ist einfach mit Object.keys:
const map = new Map();
let obj = {foo: 'bar'};
Object.keys(obj).forEach(key => {
map.set(key, obj[key]);
});
Sie können sich natürlich eine Arbeiterfunktion geben, um das zu erledigen:
function buildMap(obj) {
let map = new Map();
Object.keys(obj).forEach(key => {
map.set(key, obj[key]);
});
return map;
}
Dann
const map = buildMap({foo: 'bar'});
Oder hier ist eine l33t aussehende (ist das noch eine Sache?) Version:
function buildMap(obj) {
return Object.keys(obj).reduce((map, key) => map.set(key, obj[key]), new Map());
}
(Ja, Map#setgibt die Kartenreferenz zurück. Einige würden argumentieren, dass dies ein Missbrauch von ist reduce.)
Oder wir können die Dunkelheit wirklich übertreiben:
const buildMap = o => Object.keys(o).reduce((m, k) => m.set(k, o[k]), new Map());
Nein, das würde ich nie wirklich tun. :-)
Object.entrieswirklich ist der bessere Ansatz vorbeiObject.keys, und Bergis Generatorfunktionsansatz ist etwas direkter als entwederObject.keysoderObject.entries.