javascript - create - JSON stringify un conjunto
json.parse javascript (3)
¿Cómo podría uno 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"]"
Si bien todo el trabajo anterior, sugiero que subclasifique el conjunto y agregue un método
toJSON
para asegurarse de que encadenará correctamente.
Especialmente si vas a hacer cuerdas a menudo.
Utilizo sets 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))
Utilice este reemplazador
JSON.stringify
:
(porque
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
)
function Set_toJSON(key, value) {
if (typeof value === ''object'' && value instanceof Set) {
return [...value];
}
return value;
}
Entonces:
const fooBar = { foo: new Set([1, 2, 3]), bar: new Set([4, 5, 6]) };
JSON.stringify(fooBar, Set_toJSON)
Resultado:
"{"foo":[1,2,3],"bar":[4,5,6]}"
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()));