将循环引用的JSON字符串化
将包含循环引用的JSON对象序列化为JSON格式。
- 创建一个
WeakSet
来存储和检查已经遍历过的值,使用WeakSet.prototype.add()
和WeakSet.prototype.has()
方法。 - 使用带有自定义替换函数的
JSON.stringify()
方法,该函数会省略已经在seen
中的值,并在需要时添加新值。 - ⚠️ 注意:该函数会找到并删除循环引用,这会导致序列化后的JSON数据丢失循环引用。
const stringifyCircularJSON = obj => {
const seen = new WeakSet();
return JSON.stringify(obj, (k, v) => {
if (v !== null && typeof v === 'object') {
if (seen.has(v)) return;
seen.add(v);
}
return v;
});
};
const obj = { n: 42 };
obj.obj = obj;
stringifyCircularJSON(obj); // '{"n": 42}'