Как бы один JSON.stringify () в комплект ?
Что не работало в Chromium 43:
var s = new Set(['foo', 'bar']);
JSON.stringify(s); // -> "{}"
JSON.stringify(s.values()); // -> "{}"
JSON.stringify(s.keys()); // -> "{}"
Я ожидал получить что-то похожее на сериализованный массив.
JSON.stringify(["foo", "bar"]); // -> "["foo","bar"]"
javascript
json
ecmascript-6
МитМаро
источник
источник
Ответы:
JSON.stringify
не работает напрямую с наборами, потому что данные, хранящиеся в наборе, не сохраняются как свойства.Но вы можете преобразовать набор в массив. Тогда вы сможете правильно натянуть его.
Любой из следующих вариантов поможет:
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()));
источник
Array.from()
. Но это выглядит идиомически лучше.JSON.stringify([_ for (_ of s)])
Set.prototype.toJSON
: github.com/DavidBruant/Map-Set.prototype.toJSONИспользуйте этот
JSON.stringify
заменитель:(поскольку
toJSON
это устаревший артефакт, и лучший подход - использовать пользовательскийreplacer
, см. 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; }
Затем:
const fooBar = { foo: new Set([1, 2, 3]), bar: new Set([4, 5, 6]) }; JSON.stringify(fooBar, Set_toJSON)
Результат:
"{"foo":[1,2,3],"bar":[4,5,6]}"
источник
JSON.stringify(fooBar, (key, value) => value instanceof Set ? [...value] : value)
Хотя все вышеперечисленное работает, я предлагаю вам создать подклассы и добавить
toJSON
метод, чтобы убедиться, что он правильно структурирует. Особенно, если вы собираетесь часто натягивать струны. Я использую наборы в своих магазинах Redux, и мне нужно было убедиться, что это никогда не проблема.Это базовая реализация. Именование просто для того, чтобы проиллюстрировать ваш собственный стиль.
class JSONSet extends Set { toJSON () { return [...this] } } const set = new JSONSet([1, 2, 3]) console.log(JSON.stringify(set))
источник
toJSON
он считается устаревшей функцией. Предложение добавитьtoJSON
к обоимset
иmap
было отклонено: github.com/DavidBruant/Map-Set.prototype.toJSON/issues/16constructor
не требуется.