Рекурсивный сбор путей к файлам в вложенной структуре

Обходите массив рекурсивно, накапливая текущий путь. Строка — файл, а объект связывает имя директории с её содержимым.

Короткий ответ

Что ответить на собеседовании

Обходите массив рекурсивно, накапливая текущий путь. Строка — файл, а объект связывает имя директории с её содержимым.

Подробный разбор

Ответ с пояснениями

Условие

Функция принимает объект, описывающий файловую систему, и возвращает массив строк, где каждая строка – полный путь к отдельному файлу. Вложенность может быть произвольной, но на каждом уровне присутствует только одна директория.

/* входные данные */
const fileTree = [
  "a.js",
  "b.js",
  {
    src: [
      "some.js",
      "other.js",
      {
        components: ["someComponent.js"],
      },
    ],
  },
];

/*
  Ожидаемый результат:
  [
   'a.js',
   'b.js',
   'src/some.js',
   'src/other.js',
   'src/components/someComponent.js'
  ]
*/

const collectPaths = (arr) => {

};

console.log(collectPaths(fileTree));

Ответ

Обходите массив рекурсивно, накапливая текущий путь. Строка — файл, а объект связывает имя директории с её содержимым.

const collectPaths = arr => {
  const paths = [];
  function visit(items, prefix) {
    for (const item of items) {
      if (typeof item === 'string') paths.push(prefix + item);
      else for (const [directory, children] of Object.entries(item)) visit(children, prefix + directory + '/');
    }
  }
  visit(arr, '');
  return paths;
};

Порядок сохраняется, вход не меняется. Предполагается ациклическое дерево; при очень большой глубине нужен явный стек вместо рекурсии. Стоимость включает длину создаваемых путей.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее