【问题标题】:Convert multiple if-else statement into switch-case for objects将多个 if-else 语句转换为对象的 switch-case
【发布时间】:2018-03-14 11:44:31
【问题描述】:

我有一个对象,我必须使用多个 if-else 语句验证不同的值,如下所示是示例 javascript sn-p:

if(properties.values.a > 0 ){

}else if(properties.values.b > 0){

}else if(properties.values.c > 0){

}else if(properties.values.d > 0){

}else if(properties.values.e > 0){

}else{

}

我愿意将这个多重 if-else 语句替换为 switch-case。现在我想知道这是否适用于对象?如果可能的话,应该如何去实现它?

【问题讨论】:

  • then 部分内部应该发生什么?
  • @NinaScholz 假设它有任何要执行的 xyz 代码
  • 它总是有相同的调用吗?
  • 这作为if/else 语句更好,因为每个测试都在不同的表达式上。 switch 更适合检查一个表达式的多个可能值。

标签: javascript if-statement switch-statement


【解决方案1】:

Switch 不应该像这样工作。所以,不,这不受支持。 作为一种解决方法,您可以这样做

switch (true) {
    case (properties.values.a > 0):
        ...
    case (properties.values.b > 0):
        ...
    case (properties.values.c > 0):
        ...
    case (properties.values.d > 0):
        ...
    case (properties.values.e > 0):
        ...
}

不过,还是很丑,所以我建议你坚持 if/else。

【讨论】:

  • 在最严格的意义上,您使用switch 完全符合其预期(意味着您使用的是完全合法的配置),因此完全支持,只是不建议这样做。跨度>
【解决方案2】:

您可以使用for in 循环来做到这一点:

o = {
  a:0,
  b:0,
  c:1,
  d:0
};

for(var p in o) {
    if (o[p] > 0) {
      //...
      console.log(o[p]);
      break;
    }
}

【讨论】:

  • 当我在每次迭代中都要执行类似的表达式时,我相信你的答案会是一个答案
【解决方案3】:

如果找到值,您可以使用带有所需键的数组并使用短路迭代。

如果找不到人,请致电callOther

['a', 'b', 'c', 'd', 'e'].some(k => {
    if (properties.values[k] > 0) {
        callThis();
        return true;
    }
}) || callOther();

【讨论】:

    【解决方案4】:

    在 JavaScript 中,您只能使用 switch 来检查是否相等。不能用开关检查a > b是否。

    如果您想要一个更优雅的解决方案,我特别只会在需要检查大量规则时使用,那就是执行以下操作:

    const checkers = [];
    checkers.push([p => p.values.a > 0, () => { /* do something */ }])
    checkers.push([p => p.values.b > 0, () => { /* do something */ }])
    ...
    checkers.filter(checker => checker[0](property)).forEach(checker => checker[1]())
    

    在上面的例子中,checkers 是一个数组数组,其中第一个元素是一个谓词函数,第二个元素是一个在谓词为真时应该执行的函数。

    但同样...在大多数情况下,您只需按照您的描述执行if/else

    另外,如果你想检查一个值是否大于0,你可以只使用if(a),因为如果a不是0,那么它是真的,否则它是假的。

    编辑

    显然,从技术上讲,您可以在 switch 语句中使用逻辑表达式,即使它看起来很老套 =/

    【讨论】:

    • 好吧,从技术上讲,您可以使用switch 来检查@CataJohn 在他的回答中显示的逻辑表达式。但是,这是一些讨厌的代码。
    • 是的,但我现在想坚持 if-else .. 按照建议.. 转换会很讨厌
    • @ScottMarcus 没错,你实际上可以,但我不知道。尽管它看起来有点 hacky =/
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-26
    • 1970-01-01
    • 2022-08-23
    • 2019-07-03
    • 2019-07-04
    相关资源
    最近更新 更多