Рекурсивная обработка объектов с циклическими зависимостями в js
Допустим у меня есть объект:
const vlad = {name: 'Vlad', age: 13, address: {city: 'Moscow', house: 15}};
const kelvin = {name: 'Kelvin', age: 19, friend: vlad, address: {city: 'Saint-P', house: 13}};
const petr = {name: 'Petr', age: 89: friend: kelvin, address: {city: 'London', house: 12}};
vlad.friend = petr;
И мне нужно выполнить какую-то функцию для всех свойств обькта рекурсивно.
Пусть для примера, мы просто выводим рекурсивно все ключи.
const vlad = {
info: 'Vlad',
name: 'Vlad',
age: 13,
address: {
info: 'Vlad\'s address',
city: 'Moscow',
house: 15
}
};
const kelvin = {
info: 'Kelvin',
name: 'Kelvin',
age: 19,
friend: vlad,
address: {
info: 'Kelvin\'s address',
city: 'Saint-P',
house: 13
}
};
const petr = {
info: 'Petr',
name: 'Petr',
age: 89,
friend: kelvin,
address: {
info: 'Petr\'s address',
city: 'London',
house: 12
}
};
vlad.friend = petr;
function printKeys(obj) {
Object
.keys(obj)
.forEach(key => console.log(`${obj.info}: ${key}`));
Object
.values(obj)
.forEach(value => typeof value === "object" && value !== null && printKeys(value));
}
printKeys(vlad);
Если запоминать все пройденные обьекты в set и сравнивать при каждой итерации, есть ли встреченный обьект в сете, то будут проигнорированны обьекты, ссылки на которые встречаются повторно, но которые не содержат циклических зависимостей.
Как бы это сделать, чтобы обойти все обьекты, но при этом не зацикливаясь особо.