W jaki sposób jeden JSON.stringify () do zestawu ?
Rzeczy, które nie działały w Chromium 43:
var s = new Set(['foo', 'bar']);
JSON.stringify(s); // -> "{}"
JSON.stringify(s.values()); // -> "{}"
JSON.stringify(s.keys()); // -> "{}"
Spodziewałbym się czegoś podobnego do serializowanej tablicy.
JSON.stringify(["foo", "bar"]); // -> "["foo","bar"]"
javascript
json
ecmascript-6
MitMaro
źródło
źródło
Odpowiedzi:
JSON.stringify
nie działa bezpośrednio z zestawami, ponieważ dane przechowywane w zestawie nie są przechowywane jako właściwości.Ale możesz przekonwertować zestaw na tablicę. Wtedy będziesz w stanie poprawnie go uszlachetnić.
Dowolne z poniższych załatwi sprawę:
JSON.stringify([...s]); JSON.stringify([...s.keys()]); JSON.stringify([...s.values()]); JSON.stringify(Array.from(s)); JSON.stringify(Array.from(s.keys())); JSON.stringify(Array.from(s.values()));
źródło
Array.from()
. Ale to wygląda idiomalnie lepiej.JSON.stringify([_ for (_ of s)])
Set.prototype.toJSON
: github.com/DavidBruant/Map-Set.prototype.toJSONUżyj tego
JSON.stringify
zamiennika:(ponieważ
toJSON
jest to starszy artefakt, a lepszym podejściem jest użycie niestandardowegoreplacer
, patrz https://github.com/DavidBruant/Map-Set.prototype.toJSON/issues/16 )function Set_toJSON(key, value) { if (typeof value === 'object' && value instanceof Set) { return [...value]; } return value; }
Następnie:
const fooBar = { foo: new Set([1, 2, 3]), bar: new Set([4, 5, 6]) }; JSON.stringify(fooBar, Set_toJSON)
Wynik:
"{"foo":[1,2,3],"bar":[4,5,6]}"
źródło
JSON.stringify(fooBar, (key, value) => value instanceof Set ? [...value] : value)
Podczas gdy wszystkie powyższe działania działają, sugeruję, aby ustawić podklasę i dodać
toJSON
metodę, aby upewnić się, że stringify działa poprawnie. Zwłaszcza, jeśli masz zamiar często naciągać. Używam zestawów w moich sklepach Redux i musiałem się upewnić, że to nigdy nie jest problem.To jest podstawowa realizacja. Nazewnictwo ma na celu jedynie zilustrowanie tego, jak wybrać własny styl.
class JSONSet extends Set { toJSON () { return [...this] } } const set = new JSONSet([1, 2, 3]) console.log(JSON.stringify(set))
źródło
toJSON
jest uważane za starszą funkcję. Propozycja dodaniatoJSON
do obuset
imap
została odrzucona: github.com/DavidBruant/Map-Set.prototype.toJSON/issues/16constructor
nie jest konieczne.