¿Cómo un JSON.stringify () un conjunto ?
Cosas que no funcionaron en Chromium 43:
var s = new Set(['foo', 'bar']);
JSON.stringify(s); // -> "{}"
JSON.stringify(s.values()); // -> "{}"
JSON.stringify(s.keys()); // -> "{}"
Esperaría obtener algo similar al de una matriz serializada.
JSON.stringify(["foo", "bar"]); // -> "["foo","bar"]"
javascript
json
ecmascript-6
MitMaro
fuente
fuente
Respuestas:
JSON.stringify
no funciona directamente con conjuntos porque los datos almacenados en el conjunto no se almacenan como propiedades.Pero puede convertir el conjunto en una matriz. Entonces podrá secuenciarlo correctamente.
Cualquiera de los siguientes servirá:
fuente
Array.from()
. Pero esto parece idiomáticamente mejor.JSON.stringify([_ for (_ of s)])
Set.prototype.toJSON
: github.com/DavidBruant/Map-Set.prototype.toJSONUtilice este
JSON.stringify
sustituto:(porque
toJSON
es un artefacto heredado, y un mejor enfoque es usar uno personalizadoreplacer
, consulte https://github.com/DavidBruant/Map-Set.prototype.toJSON/issues/16 )Luego:
Resultado:
fuente
JSON.stringify(fooBar, (key, value) => value instanceof Set ? [...value] : value)
Si bien todo lo anterior funciona, le sugiero que establezca una subclase y agregue un
toJSON
método para asegurarse de que se encadena correctamente. Especialmente si vas a hacer cuerdas con frecuencia. Utilizo conjuntos en mis tiendas Redux y necesitaba asegurarme de que esto nunca fuera un problema.Esta es una implementación básica. Nombrar es solo para ilustrar el punto, elija su propio estilo.
fuente
toJSON
se considera una característica heredada. Una propuesta para agregartoJSON
a ambosset
ymap
fue rechazada: github.com/DavidBruant/Map-Set.prototype.toJSON/issues/16constructor
No es necesario anular .