You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用递归JavaScript函数简化并精简文件扩展名列表?

递归精简文件扩展名列表的JavaScript实现

我来帮你搞定这个递归精简文件扩展名列表的需求!先明确核心目标:不管输入是完整的MIME类型字符串(比如application/pdf)还是带前缀的扩展名片段(比如x-pdf),最终都要提炼出最核心的、去重后的扩展名集合(比如从所有pdf相关条目里提炼出pdf,ppt相关的提炼出ppt)。

实现思路

  1. 统一输入处理:先把输入的逗号分隔长串或片段数组,拆分成干净的单个条目列表
  2. 递归提取核心扩展名:对每个条目,递归切割掉前缀部分(比如application/、vnd.、x-这类),直到得到最底层的核心标识;还特意加了特殊映射处理,比如把powerpoint转成常用缩写ppt
  3. 去重格式化:用集合去重后,整理成你需要的字符串格式

完整代码实现

// 递归提取核心扩展名的函数
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:42:48