Обходите массив рекурсивно, накапливая текущий путь. Строка — файл, а объект связывает имя директории с её содержимым.
Рекурсивный сбор путей к файлам в вложенной структуре
Обходите массив рекурсивно, накапливая текущий путь. Строка — файл, а объект связывает имя директории с её содержимым.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Функция принимает объект, описывающий файловую систему, и возвращает массив строк, где каждая строка – полный путь к отдельному файлу. Вложенность может быть произвольной, но на каждом уровне присутствует только одна директория.
/* входные данные */
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;
};
Порядок сохраняется, вход не меняется. Предполагается ациклическое дерево; при очень большой глубине нужен явный стек вместо рекурсии. Стоимость включает длину создаваемых путей.