在递归函数调用中递增计数器

时间:2018-05-10 22:26:27

标签: javascript recursion foreach counter

我正在努力学习如何在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 :(得分:2)

使用帮助器。函数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);
}

答案 1 :(得分:1)

所以,你的问题如下:

每次递归时,您的计数器将重置为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);