如何精简含大量重复if判断的TypeScript比较器代码?
冗余if判断排序比较器优化方案
你的代码冗余来自两处可合并的重复逻辑:
- 升序、降序判断完全对称,仅返回值符号相反,不需要为两种顺序各写一整套分支判断
- 不同排序字段的分支结构完全一致,不需要堆叠多个平行的if条件块
核心优化思路
- 提前提取排序方向系数:降序时系数为
1,升序时系数为-1,最终基础比较结果直接乘这个系数即可,一次性砍掉所有重复的order.descending判断 - 为每个排序字段编写统一的基础比较逻辑(固定按升序规则返回带符号的数值即可,比较器不要求返回值必须是±1,符号正确就符合规范),用字段名作为key存成策略映射对象,直接根据
order.sortBy取对应逻辑执行,替换所有平行if块 - 针对
status排序,提前定义状态权重值,用两个元素的权重差直接得到比较结果,替换多层嵌套if;针对日期排序,提前将日期字符串转成时间戳再比较,避免重复创建Date实例,直接用时间戳差值得到比较结果,比大小判断更简洁
优化后完整代码
// 定义状态排序权重,可根据业务扩展其他状态 const STATUS_WEIGHT = { DECLINED: -1, APPROVED: 1, DEFAULT: 0 // 未明确指定的状态默认权重,相等时返回0 } as const; const comparator = (a: TimeOff, b: TimeOff): number => { // 提前计算排序方向系数,统一处理升/降序结果翻转 const sortFactor = order.descending ? 1 : -1; // 不同字段的基础比较逻辑映射,后续新增排序字段直接在这里加方法即可 const compareStrategies = { status: () => { const weightA = STATUS_WEIGHT[a.state] ?? STATUS_WEIGHT.DEFAULT; const weightB = STATUS_WEIGHT[b.state] ?? STATUS_WEIGHT.DEFAULT; return weightA - weightB; }, dateFrom: () => { const timeA = new Date(a.date_from).getTime(); const timeB = new Date(b.date_from).getTime(); return timeA - timeB; } }; // 取对应字段的基础比较结果,乘方向系数得到最终排序值 const compareFn = compareStrategies[order.sortBy as keyof typeof compareStrategies]; return compareFn ? compareFn() * sortFactor : 0; };
额外收益
- 可维护性大幅提升:后续新增排序维度(比如按创建时间、申请人姓名排序),只需要在
compareStrategies中新增对应的比较方法即可,不需要改动原有判断逻辑 - 性能更好:日期比较只需要创建2个Date实例转时间戳,不需要在每个if分支里重复创建;没有多层嵌套判断,执行路径更短
- 逻辑更清晰:排序规则和排序方向完全解耦,不需要在每个分支里反复核对升序降序的返回值是否写反
内容的提问来源于stack exchange,提问作者lusidespair
相关产品推荐
相关产品推荐

