Как построить дерево с условием в JavaScript?

Доброго времени суток!

Я пытаюсь реализовать алгоритм, который создает узлы в цикле. Если узел соответствует условию, то к нему добавляется потомок, который может содержать свои узлы с потомками, если они тоже удовлетворяют условию.

У меня есть входные данные в виде массива объектов с вопросами и ответами. Каждый ответ может ссылаться на следующую секцию по id.

Мне нужно преобразовать эти данные в древовидную структуру, где каждый узел - это вопрос, а его потомки - варианты ответов.

Я пробовал решить задачу с помощью вложенных циклов, но запутался. Может кто-то подсказать, как правильно построить такое дерево? Буду благодарен за любые идеи или примеры кода.

let входныеДанные = [
  {
    id: 1,
    название: 'первый вопрос',
    вопросы: [
      {
        id: 1,
        текст: 'У вас есть машина?',
        ответы: [
          {id: 1, текст: 'Да', следующаяСекция: 2},
          {id: 2, текст: 'Нет', следующаяСекция: 3}
        ]
      }
    ]
  },
  // другие секции...
];

// Нужно получить структуру вида:
let результат = {
  название: 'У вас есть машина?',
  потомки: [
    {
      название: 'Да',
      потомки: [
        // вложенные вопросы...
      ]
    },
    {
      название: 'Нет',
      потомки: [
        // вложенные вопросы...
      ]
    }
  ]
};

Слушай, а может попробовать использовать Map для хранения узлов? Типа такого:

function buildTree(data) {
  const nodeMap = new Map();
  
  data.forEach(section => {
    const question = section.вопросы[0];
    nodeMap.set(section.id, {
      название: question.текст,
      потомки: question.ответы.map(answer => ({
        название: answer.текст,
        потомки: []
      }))
    });
  });

  nodeMap.forEach(node => {
    node.потомки.forEach(child => {
      if (child.следующаяСекция) {
        child.потомки = [nodeMap.get(child.следующаяСекция)];
      }
    });
  });

  return nodeMap.get(1);
}

Так можно избежать лишней рекурсии и сделать код более понятным. Как думаешь?

По своему опыту могу сказать, что для таких задач отлично подходит рекурсивный подход с использованием метода reduce. Вот пример кода:

function buildTree(data) {
  return data.reduce((acc, section) => {
    const question = section.вопросы[0];
    acc[section.id] = {
      название: question.текст,
      потомки: question.ответы.map(answer => ({
        название: answer.текст,
        потомки: answer.следующаяСекция ? [acc[answer.следующаяСекция]] : []
      }))
    };
    return acc;
  }, {})[1];
}

const result = buildTree(входныеДанные);

Такой подход позволяет эффективно построить дерево за один проход по данным. Попробуй - должно работать быстро и без лишних вложенных циклов.