diff --git a/snippets/stringifyCircularJSON.md b/snippets/stringifyCircularJSON.md new file mode 100644 index 000000000..28dba0efa --- /dev/null +++ b/snippets/stringifyCircularJSON.md @@ -0,0 +1,29 @@ +--- +title: stringifyCircularJSON +tags: object,advanced +--- + +Serializes a JSON object containing circular references into a JSON format. + +- Create a `WeakSet` to store and check seen values, using `WeakSet.prototype.add()` and `WeakSet.prototype.has()`. +- Use `JSON.stringify()` with a custom replacer function that omits values already in `seen`, adding new values as necessary. +- ⚠️ **NOTICE:** This function finds and removes circular references, which causes circular data loss in the serialized JSON. + +```js +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; + }); +}; +``` + +```js +const obj = { n: 42 }; +obj.obj = obj; +stringifyCircularJSON(obj); // '{"n": 42}' +```