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

如何使用MapReduce函数简化以下TypeScript枚举映射代码?

优化TypeScript字符串数组转枚举数组的MapReduce实现

原代码存在的问题

你提供的原代码有几个明显的问题:

  • enumGroups变量未初始化就调用push,会直接抛出Cannot read properties of undefined错误
  • 三次调用filter重复遍历输入数组,做了冗余的性能消耗
  • 判断逻辑分散,后续新增枚举值时需要修改多处代码,扩展性差

用Reduce简化的最优实现

我们可以借助reduce方法,只遍历一次输入数组,同时把匹配规则和枚举值做集中管理,既提升性能又增强可维护性。

基础优化版

enum ENUM_GROUP {
    GROUP1,
    GROUP2,
    GROUP3
}

export const mapGroups = (groups: string[]): ENUM_GROUP[] => {
    // 集中定义匹配规则:每个规则包含字符串判断逻辑和对应的枚举值
    const matchRules = [
        { test: (s: string) => s.endsWith('-group1'), value: ENUM_GROUP.GROUP1 },
        { test: (s: string) => s.endsWith('-group2'), value: ENUM_GROUP.GROUP2 },
        { test: (s: string) => s.startsWith('group3-'), value: ENUM_GROUP.GROUP3 }
    ];

    // 用reduce一次遍历完成所有匹配,同时自动去重
    return groups.reduce((result, group) => {
        matchRules.forEach(rule => {
            if (rule.test(group) && !result.includes(rule.value)) {
                result.push(rule.value);
            }
        });
        return result;
    }, [] as ENUM_GROUP[]);
};

性能增强版(用Set去重)

如果输入数组较大,includes的查找性能会下降,我们可以用Set来做高效去重,最后再转成数组:

enum ENUM_GROUP {
    GROUP1,
    GROUP2,
    GROUP3
}

export const mapGroups = (groups: string[]): ENUM_GROUP[] => {
    const matchRules = [
        { test: (s: string) => s.endsWith('-group1'), value: ENUM_GROUP.GROUP1 },
        { test: (s: string) => s.endsWith('-group2'), value: ENUM_GROUP.GROUP2 },
        { test: (s: string) => s.startsWith('group3-'), value: ENUM_GROUP.GROUP3 }
    ];

    const resultSet = groups.reduce((set, group) => {
        matchRules.forEach(rule => {
            if (rule.test(group)) {
                set.add(rule.value);
            }
        });
        return set;
    }, new Set<ENUM_GROUP>());

    return Array.from(resultSet);
};

效果验证

输入示例['test-group1', 'group3-test']时,两个版本都会返回[ENUM_GROUP.GROUP1, ENUM_GROUP.GROUP3],符合预期。

优化点总结

  • 仅遍历输入数组一次,避免冗余计算,性能更优
  • 匹配规则集中管理,新增枚举值只需在matchRules中添加一条规则,扩展性强
  • 修复了原代码未初始化数组的错误
  • 自动处理去重,避免同一个枚举值被重复添加

内容的提问来源于stack exchange,提问作者hwase0ng

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 14:07:33