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';
const obj = { a: 1 };
obj.self = obj;
JSON.stringify(decycle(obj));
// '{"a":1,"self":{"$ref":"$"}}'
NPM:
npm install decycle
Yarn:
yarn add decycle
CDN:
<script src="https://unpkg.com/decycle@latest/dist/index.umd.js"></script>
ES Modules:
import { decycle } from 'decycle';
CommonJS:
const { decycle } = require('decycle');
UMD:
<script src="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:
const array = [];
array[0] = array;
JSON.stringify(decycle(array)); // '[{"$ref":"$"}]'
With replacer:
const obj = { date: new Date('2026-02-07') };
const result = decycle(obj, (value) =>
value instanceof Date ? value.toISOString() : value,
);
// { date: '2026-02-07T00:00:00.000Z' }
Release is automated with Release Please.