JavaScript中如何汇总文件夹结构下各一级目录的总文件数?
实现思路
核心需求是将任意嵌套深度的目录文件数,全部归并累加到所属的根下一级目录上。单靠array.filter无法完成这个需求:filter的作用是逐元素筛选符合条件的项,本身没有跨元素的累计状态存储能力,需要拆成「全量遍历归组累加」+「按目标结构输出」两个步骤实现。
具体实现步骤
- 定义一级目录的匹配规则:去掉路径开头的斜杠后,按
/拆分路径,拆分结果的第一个非空段对应的路径,就是当前目录项所属的一级目录。不管目录嵌套多少层,这个规则都能自动匹配归属,不需要单独写多层级的判断逻辑 - 遍历全量目录数组,跳过根目录(也就是
foldername为空的根节点项) - 对每个目录项,找到它所属的一级目录,把当前项的
amount_of_files累加到对应一级目录的计数上 - 所有项遍历完成后,把累计的计数转成要求的输出结构即可
这种单次全量遍历的实现,时间复杂度为O(n),哪怕数组有上万条数据也能高效运行,不会出现性能问题。
可直接运行的代码片段
假设你给出的7812长度的目录数组变量名为dirList,完整实现代码如下:
// 初始化Map存储每个一级目录的累计文件数 const topDirFileTotal = new Map(); // 单次遍历全量数组完成归组累加 dirList.forEach(dirItem => { // 跳过根目录本身 if (!dirItem.foldername) return; // 计算当前项所属的一级目录路径 const pathSegments = dirItem.foldername.replace(/^\//, '').split('/'); const belongTopDir = `/${pathSegments[0]}`; // 累加当前项的文件数到对应一级目录 topDirFileTotal.set( belongTopDir, (topDirFileTotal.get(belongTopDir) || 0) + dirItem.amount_of_files ); }); // 转换成要求的输出结构 const result = Array.from(topDirFileTotal, ([foldername, all_files]) => ({ foldername, all_files }));
结果验证
用题目给出的示例数值代入代码计算:
- 归属
/pm路径的所有项包括:/pm(3个文件)、/pm/css(1个文件)、/pm/js(1个文件),累计值为3+1+1=5,和示例输出的{foldername: "/pm", all_files: 5}完全一致 - 归属
/stohg路径的所有项包括:/stohg(1个文件)、/stohg/de(6个文件)、/stohg/de/pictures(21个文件),累计值为1+6+21=28,和示例输出的{foldername: "/stohg", all_files: 28}完全匹配
关于你最初的filter思路
如果要保留filter的写法,可以在完成上面的归组累加后,从原数组里筛选出所有的一级目录项,再把累计的文件数挂到对应的项上——本质和上面的实现逻辑一致。但纯靠filter回调内部做累加是行不通的:filter回调逐元素执行的时候,没法在单趟遍历里拿到全量的文件数总和,很容易出现累计值计算错误的问题。
内容的提问来源于stack exchange,提问作者T. Karter
相关产品推荐
相关产品推荐

