请问超过5种判断情况有什么方式可以替代if else吗

具体需求:
现在需要判断一个变量是否在某个区间,从而做相应逻辑。但是需要判断的情况太多了,不大于2、不大于3但是大于、...除了if else还有什么办法可以实现吗

例如:如果需要判断10次,就需要写10个if else判断

// switch case没法判断
(a) => {
  if(a <= 2) {
    // xxx
  } else if ( a <= 3) {
    // xxx
  } else if ( a <= 4) {
    // xxx
  } else if ....
}

感谢各位大佬提供的思路,综合出几种比较适合这种情况的方法:

  1. 使用switch case, 通过条件给每个状态命名,例如a <= 2则命名为<2,然后在case '<2'里处理. 但代码难读懂
  2. 如采纳答案所示,使用||做判断,看得比较轻松,但是因为最后但值限定为number,而ts报错result有可能为false,因此加了一个any类型
  3. 感谢@xianshenglu 提供的思路:职责链模式。非常实用的一个思路,但因为具体情况就只需要判断8种,而且未来不会再变更,所以就暂时不使用职责链模式,相信以后肯定也会用上。
阅读 4.7k
5 个回答

我的处理方式,供参考:

function checkRange(total) {
  const result =  (total <= 2 && 'A') || (total <= 3 && 'B') || (total <= 4 && 'C') || 'D'
  return result
}

console.log(checkRange(2))
console.log(checkRange(3))
console.log(checkRange(4))
console.log(checkRange(5))

其实你这里已经是 a <= 2 的 else 了,就可以直接写 a <= 3 了。。。

(a) => {
    if (a <= 2) // xxx
    else if (a <= 3) // xxx
    else if (a <= 4) // xxx
    else // xxx
}

或者是给每个状态命名:

const status = a <= 2
    ? '<2'
    : a <= 3
        ? '2-3'
        : a <= 4
            ? '3-4'
            : '>4'
switch (status) {
    case '<2':
    case '2-3':
    case '3-4':
    case '>4':
}

题主说命名状态难以读懂,我不是很服:

const status = a <= 2
    ? 'a小于2'
    : a <= 3
        ? '2到3'
        : a <= 4
            ? '3到4'
            : 'a大于4'
switch (status) {
    case 'a小于2':
    case '2到3':
    case '3到4':
    case 'a大于4':
}

还有就是 if else return 的例子:

if (...) {
    return a 
} else if (...) {
    return b
} else {
    return c
}

可以写作

if (...) return a
if (...) return b
return c

甚至是三元

return (...)
    ? a
    : (...)
        ? b
        : c

这时候判断有多层的话,用三元不知道比 if else 可读性好到哪里去了:

function(a, b) {
    if (a < 2) {
        if (b % 1 < .5) return 'case1'
        else return 'case2'
    } else if (a < 3) {
        return 'case3'
    } else {
        return 'case4'
    }
}

const fn = (a, b) => a < 2
        ? b % 1 < .5
            ? 'case1'
            : 'case2'
        : a < 3
            ? 'case3'
            : 'case4'

可以使用map呀 类似这种

map = {a: funca,b: funcb, c: funcc}

a<=4?a<=3?a<=2?xxx:xxx:xxx:xxx;

背景说一下,判断数值在某个区间内,具体有多少个区间?按照目前你描述的情况,如果有几十种判断岂不是要写几十个方法了?

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题