Comment un JSON.stringify () serait-il un ensemble ?
Choses qui ne fonctionnaient pas 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"]"
javascript
json
ecmascript-6
MitMaro
la source
la source
Réponses:
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 tableau. Ensuite, vous pourrez le stringifier correctement.
N'importe lequel des éléments suivants fera l'affaire:
la source
Array.from()
. Mais cela semble mieux idiomiquement.JSON.stringify([_ for (_ of s)])
Set.prototype.toJSON
: github.com/DavidBruant/Map-Set.prototype.toJSONUtilisez ce
JSON.stringify
remplaçant:(car il
toJSON
s'agit d'un artefact hérité et une meilleure approche consiste à utiliser une personnalisationreplacer
, voir https://github.com/DavidBruant/Map-Set.prototype.toJSON/issues/16 )Ensuite:
Résultat:
la source
JSON.stringify(fooBar, (key, value) => value instanceof Set ? [...value] : value)
Bien que tout ce qui précède fonctionne, je suggère que vous définissiez une sous-classe et ajoutiez un
toJSON
méthode pour vous assurer qu'elle est correctement stringifiée. Surtout si vous allez être souvent contraignant. J'utilise des sets dans mes magasins Redux et je devais m'assurer que ce n'était jamais un problème.Ceci est une implémentation de base. Le nommage est juste pour illustrer le point de choisir votre propre style.
la source
toJSON
est considérée comme une fonctionnalité héritée. Une proposition d'ajouttoJSON
aux deuxset
et amap
été rejetée: github.com/DavidBruant/Map-Set.prototype.toJSON/issues/16constructor
n'est pas nécessaire.