请教个递归算法问题,递归检查目标文件夹中是不是有命中目标后缀的文件,最多尝试 N 次

2022-03-27 22:15:12 +08:00
 alanhe421
```js
matchFn: (count, canRetryLimit, filePath, suffixes) => {
if (utils.isDirectory(filePath)) {
const files = fs.readdirSync(filePath);
for (const file of files) {
const found = utils.matchFn(count, canRetryLimit, `${filePath}/${file}`, suffixes);
if (found) {
return true;
}
}
} else {
count -= 1;
if (filePath.match(new RegExp(`(${suffixes.join('|')})$`))) {
return true;
}
}
return false;
}
```




我想实现的是递归检查目标文件夹中是不是有命中目标后缀的文件,最多尝试 N 次。


如上是基本实现,但是明显有错,else logic 下 count 没有正确消费上,请问如何改进下呢。
986 次点击
所在节点    问与答
5 条回复
disk
2022-03-27 23:31:35 +08:00
不太熟 js ,看上去 count 是个局部变量。如果你要每个文件夹内最多尝试 n 次,直接在循环里计数跳出就行了。
misdake
2022-03-28 00:10:46 +08:00
调用下一层 count 的时候,因为 count 类型是 number ,是基本类型,所以内层拿到的是一个复制。内外层的 count 不是同一个,内层减了,外层并不会变。
改动的话,可以尝试包一层,把外层变成非基本类型,比如 number[1],{inner: number}这种。这样调用 count[0]或者 count.inner 的时候内外层的 number 就是指向同一个数据了。
threebr
2022-03-28 04:50:50 +08:00
@misdake 不了解 js ,但这点跟 python 好像
ETiV
2022-03-28 05:57:10 +08:00
你是想过程正义还是结果正义…

结果正义的话,用
process.spawn("find", [filePath, "-type", "f", "-name", `*.${suffix}`)
直接调 find 去找特定后缀的文件,上面这几个参数在 macOS 跟 Linux 下都不会遇到坑
alanhe421
2022-03-28 09:57:47 +08:00
@misdake 嗯,想了下,是这个理,我 return 换成对象类型,保存 match 结果及剩余匹配次数就行了,谢谢。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/843242

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX