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



我正在努力如何在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);
}

使用帮助程序。函数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。所以你的数字可以是这样的: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);

最新更新