Comment serait-on JSON.stringify () a Set ?
Choses qui n'ont pas fonctionné dans Chromium 43:
var s = new Set(['foo', 'bar']);
JSON.stringify(s); // -> "{}"
JSON.stringify(s.values()); // -> "{}"
JSON.stringify(s.keys()); // -> "{}"
Je m'attendrais à obtenir quelque chose de similaire à celui d'un tableau sérialisé.
JSON.stringify(["foo", "bar"]); // -> "["foo","bar"]"
JSON.stringify
ne fonctionne pas directement avec les ensembles car les données stockées dans l'ensemble ne sont pas stockées en tant que propriétés.
Mais vous pouvez convertir l'ensemble en un tableau. Ensuite, vous pourrez le filtrer correctement.
L'un des éléments suivants fera l'affaire:
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()));
Utilisez ceci JSON.stringify
remplaçant:
(car toJSON
est un artefact hérité, et une meilleure approche consiste à utiliser un replacer
personnalisé, voir - 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;
}
Ensuite:
const fooBar = { foo: new Set([1, 2, 3]), bar: new Set([4, 5, 6]) };
JSON.stringify(fooBar, Set_toJSON)
Résultat:
"{"foo":[1,2,3],"bar":[4,5,6]}"
Bien que tout ce qui précède fonctionne, je vous suggère de définir une sous-classe et d'ajouter une méthode toJSON
pour vous assurer qu'elle se stringifie correctement. Surtout si vous allez souvent vous stringifier. J'utilise des ensembles dans mes magasins Redux et je devais m'assurer que ce n'était jamais un problème.
Il s'agit d'une implémentation de base. La dénomination est juste pour illustrer le point choisissez votre propre style.
class JSONSet extends Set {
toJSON () {
return [...this]
}
}
const set = new JSONSet([1, 2, 3])
console.log(JSON.stringify(set))