Увеличение счетчика в рекурсивных вызовах функций - PullRequest
0 голосов
/ 11 мая 2018

Я борюсь за то, как увеличить базовый счетчик в javascript.

Чего я хочу достичь?

Мне нужен счетчик внутри цикла foreach.Цель состоит в том, чтобы иметь возможность подсчитывать каждый раз, когда срабатывает //Write smthg.

Ниже приведена обновленная версия кода, который я использую.На данный момент он возвращает странные последовательности чисел.Я думаю, это сбрасывается каждый раз, когда запускается рекурсивный циклЯ не знаю, как это исправить, предположим, что это основная проблема с javascript, но поскольку я учусь на экспериментах и ​​самостоятельно, мне иногда приходится задавать вопрос сообществу.

function walk(dir, counter = 0) {

  fs.readdirSync(dir).forEach(file => {

    let fullPath = path.join(dir, file);

    if (fs.lstatSync(fullPath).isDirectory()) {
      counter = walk(fullPath, counter);
      walk(fullPath, counter);
      console.log('dir');
    } else {
      let size = fs.statSync(fullPath).size; // Get size of file
      listFiles.write(fullPath + " (" + size + ")\n"); // Write file path and size into copyList.xml
      ++counter;
      console.log(counter);
    }

  });
  return counter;
}

walk(copyFrom); // Starts function "walk"

Полученные последовательности:

2,3,4,5,6,7,dir,5,6,8,9,10,11,12,13,dir,11

Вот полный ответ

function walk(dir) {
  let n = 0;

  function walk(dir) {

    fs.readdirSync(dir).forEach(file => {

      ++n;
      console.log(n);
      let fullPath = path.join(dir, file);

      if (fs.lstatSync(fullPath).isDirectory()) {
        --n;
        walk(fullPath);
        console.log('dir');
      } else {
        let size = fs.statSync(fullPath).size; // Get size of file
        listFiles.write(fullPath + " (" + size + ")\n"); // Write file path and size into copyList.xml
      }

    });
  }
  return walk(dir);
}

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

Используйте помощника. Функция walk создает лексическую переменную n, а функцию walk, которая скрывает вызванную функцию на время рекурсивных вызовов. Он может иметь исходное содержимое walk, и внешняя функция просто возвращает результат вызова так, как был вызван сам.

function walk(dir) {
  let n = 0; //Counter variable
  function walk(dir) {
    dir.forEach(file => {
      ++n;
      console.log(n);
      if (true) {
        //Recurse loop
      } else {
        //Write smthg
      }
    });
  }
  return walk(dir);
}
0 голосов
/ 11 мая 2018

Итак, ваша проблема выглядит следующим образом:

Ваш счетчик будет сбрасываться в 0 каждый раз, когда вы повторяете. Таким образом, ваши цифры могут выглядеть примерно так: 0, 1, 0, 2, 0, 1, 2, 3, 3, ... и т. Д. Если вы хотите иметь итератор, подсчитывающий общее количество итераций, вам нужно передать свой счетчик в функцию и установить его по умолчанию в 0 (при первом вызове walk), например:

var files = ["dir1-file1", "dir1-file2", ["dir1-sub1-file1"], "dir1-file3", ["dir1-sub2-file1", ["dir1-sub2-subsub1-file1"]]];

function walk(dir, counter = 0) {
  dir.forEach(file => {
    if (Array.isArray(file)) {
      // pass counter in to recursed function call
      // set current function counter to the result of the recursed function calls
      counter = walk(file, counter);
    } else {
      //Write smthg
      ++counter;
      console.log(counter);
      console.log(file);
    }
  });
  // return the counter for parent
  return counter;
}

walk(files);
...