JSON字符串化一个Set

Mit*_*aro 75 javascript json ecmascript-6

如何将一个JSON.stringify()

在Chromium 43中无效的事情:

var s = new Set(['foo', 'bar']);

JSON.stringify(s); // -> "{}"
JSON.stringify(s.values()); // -> "{}"
JSON.stringify(s.keys()); // -> "{}"
Run Code Online (Sandbox Code Playgroud)

我希望得到类似于序列化数组的东西.

JSON.stringify(["foo", "bar"]); // -> "["foo","bar"]"
Run Code Online (Sandbox Code Playgroud)

Ori*_*iol 79

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()));
Run Code Online (Sandbox Code Playgroud)

  • 列表理解也可以起作用:`JSON.stringify([_ for(_ of s)])` (5认同)
  • 只是添加一些参考文献[MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set)有一些这方面的例子和其他相关技术 (3认同)
  • 我打算提出Array.from()。但这看起来更好。 (2认同)
  • 目前提出改进`Set.prototype.toJSON`默认值的提议:https://github.com/DavidBruant/Map-Set.prototype.toJSON (2认同)

tan*_*y_k 22

使用此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;
}
Run Code Online (Sandbox Code Playgroud)

然后:

const fooBar = { foo: new Set([1, 2, 3]), bar: new Set([4, 5, 6]) };
JSON.stringify(fooBar, Set_toJSON)
Run Code Online (Sandbox Code Playgroud)

结果:

"{"foo":[1,2,3],"bar":[4,5,6]}"
Run Code Online (Sandbox Code Playgroud)

  • ES6 有缩短版本 `JSON.stringify(fooBar, (key, value) => value instanceof Set ? [...value] : value)` (8认同)
  • 相应的reviver留给读者作为练习?;-) (2认同)

Ste*_*ton 5

在完成上述所有工作的同时,我建议您子集化并添加一个toJSON方法以确保它正确化了字符串。特别是如果您经常要抽筋。我在Redux商店中使用集,并需要确保这绝不是问题。

这是一个基本的实现。命名只是为了说明您选择自己的样式。

class JSONSet extends Set {
    toJSON () {
        return [...this]
    }
}

const set = new JSONSet([1, 2, 3])
console.log(JSON.stringify(set))
Run Code Online (Sandbox Code Playgroud)

  • 我不推荐这种方法,因为“ toJSON”被认为是一项遗留功能。将`toJSON`同时添加到`set`和`map`中的提议被拒绝了:https://github.com/DavidBruant/Map-Set.prototype.toJSON/issues/16 (2认同)