Wie würde ein JSON.stringify () ein Set ?
Dinge, die in Chromium 43 nicht funktionierten:
var s = new Set(['foo', 'bar']);
JSON.stringify(s); // -> "{}"
JSON.stringify(s.values()); // -> "{}"
JSON.stringify(s.keys()); // -> "{}"
Ich würde erwarten, etwas Ähnliches wie ein serialisiertes Array zu bekommen.
JSON.stringify(["foo", "bar"]); // -> "["foo","bar"]"
javascript
json
ecmascript-6
MitMaro
quelle
quelle
Antworten:
JSON.stringify
funktioniert nicht direkt mit Sets, da die im Set gespeicherten Daten nicht als Eigenschaften gespeichert werden.Sie können das Set jedoch in ein Array konvertieren. Dann können Sie es richtig stringifizieren.
Eine der folgenden Möglichkeiten reicht aus:
quelle
Array.from()
. Das sieht aber idiomisch besser aus.JSON.stringify([_ for (_ of s)])
Set.prototype.toJSON
: github.com/DavidBruant/Map-Set.prototype.toJSONVerwenden Sie diesen
JSON.stringify
Ersatz:(Da
toJSON
es sich um ein altes Artefakt handelt und ein besserer Ansatz darin besteht, ein benutzerdefiniertes Artefakt zu verwendenreplacer
, siehe https://github.com/DavidBruant/Map-Set.prototype.toJSON/issues/16 )Dann:
Ergebnis:
quelle
JSON.stringify(fooBar, (key, value) => value instanceof Set ? [...value] : value)
Während all die oben genannten Arbeiten, schlage ich vor, dass Sie eine Unterklasse festlegen und eine
toJSON
Methode hinzufügen , um sicherzustellen, dass die Zeichenfolge korrekt ist. Vor allem, wenn Sie häufig fädeln werden. Ich verwende Sets in meinen Redux-Filialen und musste sicherstellen, dass dies nie ein Problem war.Dies ist eine grundlegende Implementierung. Die Benennung dient nur zur Veranschaulichung des Punktes, bei dem Sie Ihren eigenen Stil auswählen.
quelle
toJSON
als Legacy-Funktion angesehen wird. Ein Vorschlag hinzufügen ,toJSON
um beideset
undmap
wurde abgelehnt: github.com/DavidBruant/Map-Set.prototype.toJSON/issues/16constructor
ist nicht erforderlich.