如何重构Node.js中反向向上遍历文件路径的函数使其更简洁
路径遍历函数重构方案
问题背景
现有一个存储文件完整路径的字符串,已实现沿文件路径反向向上遍历各级目录的函数,函数可正常运行,但实现逻辑繁琐冗余,需要重构简化。
原有实现代码:
const path = require('path') function walk(file) { let dir = path.dirname(file) let arr = dir.split('/').filter(e => e).reverse() let paths = [] for(let i = arr.length; i >= 0; i--) { let sub = arr.slice(i) paths.push(sub.reverse().join('/')) } paths = paths.filter(e => e).reverse() paths.forEach(path => { console.log('/' + path) }) } walk('/D0/D1/D2/D3/foo.bar')
原有代码存在的冗余问题:
- 多次对数组执行
reverse()操作,逻辑绕,可读性差 - 手动拆分、拼接路径字符串,没有充分利用
path模块的内置能力,存在跨平台兼容隐患 - 重复对空值做过滤,存在不必要的性能损耗
优化思路
利用path.dirname()的固有特性:根目录的父目录就是它自身,通过循环逐级向上取父目录,直到抵达根目录终止即可,完全不需要手动做路径字符串的拆分、反转、拼接。
重构后实现
const path = require('path') function walk(file) { let currentDir = path.dirname(file) const dirList = [] // 未到根目录时持续向上遍历 while (currentDir !== path.dirname(currentDir)) { dirList.push(currentDir) currentDir = path.dirname(currentDir) } // 按从深到浅的顺序输出各级目录,和原函数输出顺序完全一致 dirList.forEach(dir => console.log(dir)) } // 测试调用 walk('/D0/D1/D2/D3/foo.bar')
运行输出和原函数完全一致:
/D0/D1/D2/D3 /D0/D1/D2 /D0/D1 /D0
实现优势
- 逻辑直观线性,没有多余的数组反转、切片、重复过滤操作,代码量减少近一半,可读性大幅提升
- 完全依赖Node.js内置path模块处理路径,自动适配不同操作系统的路径分隔符,不会出现手动拼接路径导致的Windows系统下路径格式错误问题
- 没有多余的数组遍历操作,执行效率更高
*如果需要额外输出根目录/,只需要在循环结束后将根目录追加到dirList再遍历输出即可。
内容的提问来源于stack exchange,提问作者Bill Kervaski
相关产品推荐
相关产品推荐

