Придется слегка "нормализовать" объект.
Например, было так:
const obj = {
a: 123,
b: {
v: 'qq'
},
c: {
x: {}
},
};
obj.c.d = obj.b; // перекрестная ссылка
obj.c.r = obj; // кольцевая ссылка
в нормальзованном варианте должно стать
const norm = {
'#0': {
a: 123,
b: '#1',
c: {
x: {},
d: '#1',
r: '#0'
},
},
'#1': {
v: 'qq'
}
}
можно обойти объект рекурсивно, считая ссылки на подобъекты (с помощью Map). Если что-то используется хотя бы дважды, как, например, obj.b, оно выносится отдельно и получает уникальный id. Корневой объект всегда обозначается как '#0'