Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 27.08.2018, 13:22
Аспирант
Отправить личное сообщение для Tipylja Посмотреть профиль Найти все сообщения от Tipylja
 
Регистрация: 17.04.2017
Сообщений: 72

Как вернуть несколько значений из рекурсивной функции?
Здравствуйте. Есть рекурсивная функция, которая ходит по файловой системе и возвращает массив с путями к файлам. Вот так это выглядит:
const fs = require('fs').promises
      ,readdir = (fs.readdir)

const scanFile = async (dir, filelist = []) =>{
    const files = await readdir(dir);
    for (let file of files) {
        const dirFile = path.join(dir, file);
        try {
            filelist = await scanFile(dirFile, filelist);
        }
        catch (err) {
            if (err.code === 'ENOTDIR' || err.code === 'EBUSY'){
                filelist = [...filelist, dirFile]; //Массив с файлами
            }
            else throw err;
        }
    }
    return filelist;

};

Мне необходимо получить, помимо массива с путями к файлам, массив путей для директорий. В функцию добавляю пару строк:
const stat = await fs.lstat(dirFile);

и в цикл:
if(stat.isDirectory()){
                //arrFolder.push(dirFile); //Массив с папками
                arrFolder = [...arrFolder, dirFile];
            }
filelist = await scanFile(dirFile, filelist);

Получаю вот такую функцию
const scanFile = async (dir, filelist = []) =>{
    const files = await readdir(dir);
    const stat = await fs.lstat(dirFile);
    for (let file of files) {
        const dirFile = path.join(dir, file);
        try {            

            if(stat.isDirectory()){
                //arrFolder.push(dirFile); //Массив с папками
                arrFolder = [...arrFolder, dirFile];
            }
            filelist = await scanFile(dirFile, filelist);
        }
        catch (err) {
            if (err.code === 'ENOTDIR' || err.code === 'EBUSY'){
                filelist = [...filelist, dirFile]; //Массив с файлами
            }
            else throw err;
        }
    }
    return filelist;
};

Теперь я хочу возвращать из функции два значения, а не только
“return filelist”

Пробую возвращать объект, но функция ломается, потому что, по всей видимости, аргументы перестают правильно передаваться рекурсивно. Пробовал переписать функцию под аргументы в виде объекта, но ничего не вышло. Подскажите пожалуйста, как мне вернуть несколько значений, что то-вроде этого:
return{
         filelist: filelist,
         arrFolder: arrFolder
 }

И так, что бы функция не сломалась
Ответить с цитированием
  #2 (permalink)  
Старый 27.08.2018, 16:58
Аватар для SuperZen
Профессор
Отправить личное сообщение для SuperZen Посмотреть профиль Найти все сообщения от SuperZen
 
Регистрация: 08.11.2017
Сообщений: 642

const a = ({ b = [], c }) => {
  return { f: b, g: c }
}
const { f, g } = a({ b: ['one'], c: 'two' })
console.log(f, g)
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как обработать переданные функции параметры как массив? javascript_pupil Общие вопросы Javascript 7 19.08.2016 13:59
как вернуть переменую в swfupload ureech jQuery 13 01.05.2016 20:43
НЕСКОЛЬКО ЗНАЧЕНИЙ ИЗ INPUT ВЫВЕСТИ ПОСЛЕДОВАТЕЛЬНО Brook Events/DOM/Window 1 20.04.2012 23:32
JS классы - как объединить функции в класс olga153b Events/DOM/Window 3 01.11.2011 14:13
Как проверить существование функции Aderba Общие вопросы Javascript 2 14.11.2008 16:09