Bitte sehen Sie die Antwort von nils mitObject.entries
und / oder die Antwort von bergi mit einer Generatorfunktion . Obwohl Object.entries
es 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
Map
Konstruktor ruft eine Funktion für das Array auf, um einen Iterator abzurufen. Das Array erstellt ein Array-Interatorobjekt und gibt es zurück.
- Der
Map
Konstruktor 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
Map
Konstruktor ruft eine Funktion für dieses Generatorobjekt auf, um einen Iterator daraus abzurufen. Das Generatorobjekt gibt sich selbst zurück
- Der
Map
Konstruktor 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.entries
ist 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 Map
kö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#set
gibt 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.entries
wirklich ist der bessere Ansatz vorbeiObject.keys
, und Bergis Generatorfunktionsansatz ist etwas direkter als entwederObject.keys
oderObject.entries
.