如何使用递归JavaScript函数简化并精简文件扩展名列表?
递归精简文件扩展名列表的JavaScript实现
我来帮你搞定这个递归精简文件扩展名列表的需求!先明确核心目标:不管输入是完整的MIME类型字符串(比如application/pdf)还是带前缀的扩展名片段(比如x-pdf),最终都要提炼出最核心的、去重后的扩展名集合(比如从所有pdf相关条目里提炼出pdf,ppt相关的提炼出ppt)。
实现思路
- 统一输入处理:先把输入的逗号分隔长串或片段数组,拆分成干净的单个条目列表
- 递归提取核心扩展名:对每个条目,递归切割掉前缀部分(比如
application/、vnd.、x-这类),直到得到最底层的核心标识;还特意加了特殊映射处理,比如把powerpoint转成常用缩写ppt - 去重格式化:用集合去重后,整理成你需要的字符串格式
完整代码实现
// 递归提取核心扩展名的函数 function getCoreExtension(str) { // 定义需要处理的分隔符:MIME类型的/、扩展名前缀的-或. const separators = ['/', '-', '.']; // 找到当前字符串中最先出现的分隔符位置 const sepIndex = separators.reduce((minIndex, sep) => { const idx = str.indexOf(sep); return idx !== -1 && (minIndex === -1 || idx < minIndex) ? idx : minIndex; }, -1); // 没有分隔符时,说明已拿到核心扩展名 if (sepIndex === -1) { const coreExt = str.toLowerCase(); // 特殊扩展名映射:比如powerpoint转ppt,可按需扩展 const extMap = { 'powerpoint': 'ppt' }; return extMap[coreExt] || coreExt; } // 递归处理分隔符后面的部分 return getCoreExtension(str.slice(sepIndex + 1)); } // 主函数:处理输入并返回精简后的结果 function simplifyExtensions(input) { // 统一处理输入格式:字符串按逗号分割,数组直接清洗空值 const items = typeof input === 'string' ? input.split(',').map(item => item.trim()).filter(item => item) : input.map(item => item.trim()).filter(item => item); // 用Set自动去重,同时提取每个条目的核心扩展名 const uniqueCoreExts = new Set(items.map(item => getCoreExtension(item))); // 转成要求的输出格式:"pdf", "ppt" return Array.from(uniqueCoreExts).map(ext => `"${ext}"`).join(', '); } // 测试示例1:完整MIME类型输入 const input1 = "application/pdf, application/x-pdf, application/acrobat, applications/vnd.pdf, text/pdf, text/x-pdf, application/ppt, application/vnd.ms-powerpoint"; console.log(simplifyExtensions(input1)); // 输出:"pdf", "ppt" // 测试示例2:扩展名片段输入 const input2 = ["pdf", "x-pdf", "vnd.pdf", "pdf", "x-pdf", "ppt"]; console.log(simplifyExtensions(input2)); // 输出:"pdf", "ppt"
代码说明
- 递归函数
getCoreExtension是核心逻辑,它会逐层剥离前缀,直到拿到最本质的扩展名;如果之后需要处理其他特殊映射(比如word转doc),直接在extMap里添加键值对就行 - 主函数
simplifyExtensions做了兼容处理,不管你传的是逗号分隔的字符串还是数组,都能正常处理 - 用
Set去重比手动遍历更简洁高效,最后再转成你需要的带引号的字符串格式
内容的提问来源于stack exchange,提问作者The Old County
相关产品推荐
相关产品推荐

