如何使用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
相关产品推荐
相关产品推荐

