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

TypeScript/JavaScript中除switch、三元外嵌套if-else的替代方案

低复杂度重构实现(无switch、无三元运算符)

这类分支执行逻辑完全一致、仅传入参数不同的场景,用配置映射查表是最优解,能直接把原代码的圈复杂度降到ESLint规则要求的阈值内,后续扩展也不需要新增分支判断。

重构思路

  1. 先抽离所有分支重复的公共逻辑,消除重复的判空、重复的方法调用代码
  2. 把不同sortBy场景对应的查询参数整理成结构化配置,用键值对的形式做映射匹配
  3. 匹配不到合法配置时直接走默认排序逻辑,最后统一构造查询语句,全程不需要多层if-else嵌套、不需要switch、不需要三元运算符。

重构后代码

// 提前计算通用排序方向,消除每个分支重复的order判空逻辑
let sortDirection = 'DESC'
if (order && order.length) {
  sortDirection = order
}

// 排序规则配置表,后续新增排序类型直接在这里加配置即可,无需改动核心逻辑
const sortConfigMap = {
  updated_at: {
    distinctOn: ['adjustments.updated_at', 'adjustments.id'],
    orderRules: [
      { field: 'adjustments.updated_at', direction: sortDirection },
      { field: 'adjustments.id', direction: sortDirection }
    ]
  },
  default_priority: {
    distinctOn: ['adjustments.default_priority', 'adjustments.id', 'adjustments.priority_action_value'],
    orderRules: [
      { field: 'adjustments.default_priority', direction: sortDirection },
      { field: 'adjustments.priority_action_value', direction: 'DESC' }
    ]
  }
}

// 默认排序配置,对应原代码else分支逻辑
const defaultSortConfig = {
  distinctOn: ['adjustments.created_at', 'adjustments.id'],
  orderRules: [
    { field: 'adjustments.created_at', direction: sortDirection },
    { field: 'adjustments.id', direction: sortDirection }
  ]
}

// 匹配当前生效的排序配置
let activeConfig = defaultSortConfig
if (sortBy.length && sortConfigMap[sortBy]) {
  activeConfig = sortConfigMap[sortBy]
}

// 统一构造查询,无分支嵌套
createQuery.distinctOn(activeConfig.distinctOn)
activeConfig.orderRules.forEach((rule, index) => {
  if (index === 0) {
    createQuery.orderBy(rule.field, rule.direction)
    return
  }
  createQuery.addOrderBy(rule.field, rule.direction)
})

方案优势

  • 圈复杂度从原代码的4直接降到2,完全满足ESLint复杂度管控要求
  • 配置集中管理,新增排序规则时不需要改动查询构造的核心逻辑,只需要在配置表新增对应条目即可,维护成本低
  • 消除了原代码里重复的判空、重复的方法调用,顺带修复了原代码中DESC缺失前引号的笔误,不会出现多分支改漏的问题
  • 逻辑完全扁平,没有嵌套判断,可读性远高于多层if-else

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 16:01:07