Como seria um JSON.stringify () um Set ?
Coisas que não funcionaram no Chromium 43:
var s = new Set(['foo', 'bar']);
JSON.stringify(s); // -> "{}"
JSON.stringify(s.values()); // -> "{}"
JSON.stringify(s.keys()); // -> "{}"
Eu esperaria obter algo semelhante ao de uma matriz serializada.
JSON.stringify(["foo", "bar"]); // -> "["foo","bar"]"
javascript
json
ecmascript-6
MitMaro
fonte
fonte
Respostas:
JSON.stringify
não funciona diretamente com conjuntos porque os dados armazenados no conjunto não são armazenados como propriedades.Mas você pode converter o conjunto em uma matriz. Então você será capaz de restringi-lo corretamente.
Qualquer uma das opções a seguir resolverá o problema:
fonte
Array.from()
. Mas isso parece idiomicamente melhor.JSON.stringify([_ for (_ of s)])
Set.prototype.toJSON
: github.com/DavidBruant/Map-Set.prototype.toJSONUse este
JSON.stringify
substituto:(porque
toJSON
é um artefato legado e uma abordagem melhor é usar um personalizadoreplacer
, consulte https://github.com/DavidBruant/Map-Set.prototype.toJSON/issues/16 )Então:
Resultado:
fonte
JSON.stringify(fooBar, (key, value) => value instanceof Set ? [...value] : value)
Embora todo o trabalho acima funcione, sugiro que você defina uma subclasse e adicione um
toJSON
método para ter certeza de que o stringify está correto. Especialmente se você for restringir com frequência. Eu uso conjuntos em minhas lojas Redux e precisava ter certeza de que isso nunca seria um problema.Esta é uma implementação básica. Nomear é apenas para ilustrar o ponto, escolha seu próprio estilo.
fonte
toJSON
é considerada um recurso legado. Uma proposta para adicionartoJSON
a ambosset
emap
foi rejeitada: github.com/DavidBruant/Map-Set.prototype.toJSON/issues/16constructor
não é necessário.