如何获取无末尾斜杠的当前目录名称
解决无末尾斜杠时的当前目录检查问题
这个问题确实容易踩坑——原代码的逻辑依赖路径末尾的斜杠,一旦路径没有这个斜杠,lastIndexOf('/')就会定位到父目录的分隔符位置,导致判断完全错误。其实修复起来很简单,这里有几个实用的方案:
方案一:先标准化路径格式
先把当前路径统一处理成带末尾斜杠的格式(根目录除外),再沿用原有的判断逻辑:
function checkDir(theDir) { let loc = window.location.pathname; // 给非根目录的路径添加末尾斜杠(如果没有的话) if (loc !== '/' && !loc.endsWith('/')) { loc += '/'; } const dir = loc.substring(0, loc.lastIndexOf('/')); return dir === theDir; }
原理说明:
- 比如当前路径是
/projects,会被转换成/projects/,截取后得到/projects,和目标目录/projects匹配; - 如果路径本身就是
/projects/,则保持不变,截取结果同样是/projects; - 根目录
/会被特殊处理,避免变成//。
方案二:通过路径分割获取当前目录
另一种更清晰的思路是把路径拆分成数组,直接提取最后一级目录:
function checkDir(theDir) { const pathParts = window.location.pathname.split('/').filter(part => part !== ''); // 构造标准化的当前目录路径 const currentDir = pathParts.length === 0 ? '/' : `/${pathParts[pathParts.length - 1]}`; return currentDir === theDir; }
原理说明:
split('/')会把路径拆分成数组,比如/blog/post拆成['', 'blog', 'post'],/blog/post/拆成['', 'blog', 'post', ''];filter(part => part !== '')去掉空字符串,得到有效目录部分['blog', 'post'];- 最后取数组的最后一个元素,拼出当前目录路径
/post,和目标目录对比。
额外优化:兼容目标目录的斜杠差异
如果你的theDir参数可能带或不带末尾斜杠(比如用户传入/projects或/projects/),可以给目标目录也做标准化处理:
function checkDir(theDir) { // 标准化目标目录:去掉末尾斜杠(根目录除外) const normalizedTarget = theDir !== '/' ? theDir.replace(/\/$/, '') : '/'; let loc = window.location.pathname; // 标准化当前路径 if (loc !== '/' && !loc.endsWith('/')) { loc += '/'; } const currentDir = loc.substring(0, loc.lastIndexOf('/')); return currentDir === normalizedTarget; }
这样不管传入的目标目录格式如何,都能准确匹配当前目录。
内容的提问来源于stack exchange,提问作者Jonathan
相关产品推荐
相关产品推荐

