¿Cómo sería un JSON.stringify() un Set ?
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"]"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ás encadenarlo correctamente.
Cualquiera de los siguientes hará el truco:
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()));Puede pasar una función de "reemplazo" a JSON.stringify :
const fooBar = { foo: new Set([1, 2, 3]), bar: new Set([4, 5, 6]) }; JSON.stringify( fooBar, (_key, value) => (value instanceof Set ? [...value] : value) );Resultado:
"{"foo":[1,2,3],"bar":[4,5,6]}" toJSON es un artefacto heredado, y un mejor enfoque es usar un replacer personalizado , consulte https://github.com/DavidBruant/Map-Set.prototype.toJSON/issues/16
Si bien todo lo anterior funciona, sugiero que establezca una subclase y agregue un método toJSON para asegurarse de que se encadene correctamente. Especialmente si vas a estar tensando a menudo. Uso 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, elige tu propio estilo.
class JSONSet extends Set { toJSON () { return [...this] } } const set = new JSONSet([1, 2, 3]) console.log(JSON.stringify(set))