TypeScript/JavaScript中除switch、三元外嵌套if-else的替代方案
低复杂度重构实现(无switch、无三元运算符)
这类分支执行逻辑完全一致、仅传入参数不同的场景,用配置映射查表是最优解,能直接把原代码的圈复杂度降到ESLint规则要求的阈值内,后续扩展也不需要新增分支判断。
重构思路
- 先抽离所有分支重复的公共逻辑,消除重复的判空、重复的方法调用代码
- 把不同
sortBy场景对应的查询参数整理成结构化配置,用键值对的形式做映射匹配 - 匹配不到合法配置时直接走默认排序逻辑,最后统一构造查询语句,全程不需要多层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
相关产品推荐
相关产品推荐

