JSON decycle replaces circular references with {"$ref": PATH}, where PATH is the JSONPath of the first occurrence.
Inspired by cycle.js.
import{decycle}from'decycle';constobj={a: 1};obj.self=obj;JSON.stringify(decycle(obj));// '{"a":1,"self":{"$ref":"$"}}'NPM:
npm install decycleYarn:
yarn add decycleCDN:
<scriptsrc="https://unpkg.com/decycle@latest/dist/index.umd.js"></script>ES Modules:
import{decycle}from'decycle';CommonJS:
const{ decycle }=require('decycle');UMD:
<scriptsrc="https://unpkg.com/decycle@latest/dist/index.umd.js"></script><script>const{ decycle }=window.decycle;</script>Returns a deep copy of object or array with circular references replaced by {"$ref": PATH}.
Type: unknown
The object or array to decycle.
Type: (value: unknown) => unknown
Optional replacer function called for each value. It receives a value and returns a replacement value.
Circular array:
constarray=[];array[0]=array;JSON.stringify(decycle(array));// '[{"$ref":"$"}]'With replacer:
constobj={date: newDate('2026-02-07')};constresult=decycle(obj,(value)=>valueinstanceofDate ? value.toISOString() : value,);// { date: '2026-02-07T00:00:00.000Z' }Release is automated with Release Please.