将循环引用的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}'