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

如何精简含大量重复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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 09:12:30