web-dev-qa-db-fra.com

JSON stringifier un ensemble

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"]"
66
MitMaro

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()));
69
Oriol

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]}"
16
tanguy_k

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))
4
Stephen Bolton