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