Ich möchte ES6 Map anstelle von JS-Objekten verwenden, werde jedoch zurückgehalten, da ich nicht herausfinden kann, wie eine Map mit JSON.stringify () erstellt wird. Meine Schlüssel sind garantiert Zeichenfolgen und meine Werte werden immer aufgelistet. Muss ich wirklich eine Wrapper-Methode schreiben, um zu serialisieren?
102
[...someMap.entries()].join(';')
; für etwas komplexeres könnten Sie etwas Ähnliches versuchen, indem Sie etwas wie[...someMap.entries()].reduce((acc, cur) => acc + `${cur[0]}:${/* do something to stringify cur[1] */ }`, '')
obj[key]
kann Ihnen etwas Unerwartetes bringen. Betrachten Sie den Fallif (!obj[key]) obj[key] = newList; else obj[key].mergeWith(newList);
.Antworten:
Das kannst du nicht.
Die Schlüssel einer Karte können alles sein, einschließlich Objekte. Die JSON-Syntax erlaubt jedoch nur Zeichenfolgen als Schlüssel. Im Allgemeinen ist das also unmöglich.
In diesem Fall können Sie ein einfaches Objekt verwenden. Es wird diese Vorteile haben:
quelle
hasOwnProperty
. Ohne dies iteriert Firefox Objekte viel schneller als Karten. Karten sind in Chrome jedoch immer noch schneller. jsperf.com/es6-map-vs-object-properties/95Sie können die
Map
Instanz nicht direkt stringifizieren, da sie keine Eigenschaften hat, aber Sie können sie in ein Array von Tupeln konvertieren:Verwenden Sie für die Umkehrung
quelle
Map
s und passt gut zum Konstruktor und Iterator. Es ist auch die einzige sinnvolle Darstellung von Karten, die keine Zeichenfolgenschlüssel haben und deren Objekt dort nicht funktionieren würde.JSON.stringify(Object.fromEntries(map.entries()))
undnew Map(Object.entries(JSON.parse(jsonText)))
key
es sich um ein Objekt handelt, z. B."{"[object Object]":{"b":2}}"
- Objektschlüssel sind eines der Hauptmerkmale von MapsBeides
JSON.stringify
undJSON.parse
unterstützen ein zweites Argument.replacer
undreviver
jeweils. Mit Ersetzer und Reviver unten ist es möglich, Unterstützung für native Map-Objekte hinzuzufügen, einschließlich tief verschachtelter WerteVerwendung :
Tiefes Verschachteln mit einer Kombination aus Arrays, Objekten und Karten
quelle
Obwohl Ecmascript noch keine Methode bereitstellt, kann dies dennoch verwendet werden,
JSON.stingify
wenn Sie dasMap
einem JavaScript- Grundelement zuordnen . Hier ist das Beispiel, dasMap
wir verwenden werden.Wechseln zu einem JavaScript-Objekt
Sie können mit der folgenden Hilfsfunktion in ein JavaScript-Objektliteral konvertieren.
Wechseln zu einem JavaScript-Array von Objekten
Die Hilfsfunktion für diese wäre noch kompakter
Zum Array von Arrays gehen
Dies ist noch einfacher, Sie können nur verwenden
quelle
Mit Spread Sytax Map kann in einer Zeile serialisiert werden:
und deserialisieren Sie es mit:
quelle
Stringifizieren Sie eine
Map
Instanz (Objekte als Schlüssel sind in Ordnung) :oder
oder
Ausgabeformat:
quelle
Eine bessere Lösung
Ausgabe
Hoffe, das ist weniger nervös als die obigen Antworten.
quelle
IJSONAble
Schnittstelle verwenden (natürlich mit TypeScript).Die folgende Lösung funktioniert auch, wenn Sie verschachtelte Karten haben
quelle
Map
Karte handelte und (noch schlimmer), dass jede Unterkarte (die sie enthält) ursprünglich auch eine Karte war. Ansonsten gibt es keine Möglichkeit, sicher zu sein, dass einarray of pairs
nicht nur genau das sein soll, sondern eine Karte. Hierarchien von Objekten und Arrays tragen diese Last nicht, wenn sie analysiert werden. Jede ordnungsgemäße Serialisierung vonMap
würde ausdrücklich darauf hinweisen, dass es sich um eine handeltMap
.