将多个if-else语句转换为对象的switch-case

时间:2018-03-14 11:44:32

标签: javascript if-statement switch-statement

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

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。现在我想知道对象是否可能?如果可能的话,应该怎么做呢?

4 个答案:

答案 0 :(得分:2)

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。

答案 1 :(得分:1)

您可以使用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;
    }
}




答案 2 :(得分:1)

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

如果找不到任何人,请致电callOther

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

答案 3 :(得分:1)

在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是一个数组数组,其中第一个元素是谓词函数,第二个元素是谓词为true时应该执行的函数。

但是再次......对于大多数情况,你只需按照你的描述做if/else

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

修改

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