Рекурсивная обработка объектов с циклическими зависимостями в 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 и сравнивать при каждой итерации, есть ли встреченный обьект в сете, то будут проигнорированны обьекты, ссылки на которые встречаются повторно, но которые не содержат циклических зависимостей.

Как бы это сделать, чтобы обойти все обьекты, но при этом не зацикливаясь особо.


Ответы (1 шт):

Автор решения: Igor

Передавайте в рекурсивную функцию копию сета.

→ Ссылка