简化 switch 语句

Simplify switch statement

有 3 个布尔变量 (var1, var2, var3) 如果其中之一为真(对于每个我都需要执行自己的操作)或者如果其中两个为真(执行特殊操作)+如果满足 none 个条件则为默认值

我试过了,但效果不是很好

switch (true) {
  case (var1 || var2) && (var2 || var3):
    console.log('multi');
    break
  case var1:
    console.log('var1');
    break
  case var2:
    console.log('var2');
    break
  case var3:
    console.log('var3');
    break
  default:
    console.log('default')
 }

试试这个

switch (true) {
  case (var1 && var2) || (var1 && var3) || (var2 && var3):
    console.log('multi');
    break
  case var1:
    console.log('var1');
    break
  case var2:
    console.log('var2');
    break
  case var3:
    console.log('var3');
    break
  default:
    console.log('default')
 }

不幸的是,如果 var2 为真且 var1 和 var3 都不为真,(var1 || var2) && (var2 || var3) 会成功。

您可以将 (var1 || var2) && (var2 || var3) 替换为 ((var1 && (var 2 || var 3)) || (var2 && var3))

@EVeras 解决方案也可以。

true可以强制转换为1false可以强制转换为0,所以可以直接把布尔值相加,看有多少为真。此外,您可以直接使用 if 语句而不是打开 true.

if(var1 + var2 + var3 > 1){
    console.log('multi');
} else if(var1){
    console.log('var1');
} else if(var2){
    console.log('var2');
} else if(var3){
    console.log('var3');
} else {
    console.log('default');
}

也许我们可以试试这个:

switch (true) {
     case !(var1 ^ var2 ^ var3):
       console.log('multi');
       break;
     case var1:
       console.log('var1');
       break;
     case var2:
       console.log('var2');
       break;
     case var3:
       console.log('var3');
       break;
     default:
       console.log('default');
   }

这实际上是基于 3 输入异或逻辑:

为了便于理解,附上图片:

只要有两个 true,您就会注意到,结果将为假(因此 !)。但是当所有这些都是 false 时,它会失败,如带有红色框的快照所示。为此,我们将不得不单独处理,然后解决方案将不会保持优雅。所以这个解就是NOT COMPLETELY CORRECT.

用简单的事实编码table

var1 var2 var3 result
false false false default
false false true var3
false true false var2
false true true multi
true false false var1
true false true multi
true true false multi
true true true multi

现在您可以非常轻松地在代码中执行相同的操作,然后针对不同的条件附加不同的处理程序。整个逻辑变成了一个非常简单的查找:

//sample handlers for the different conditions
function defaultHandler() { console.log("default"); }
function var1Handler()    { console.log("var1");    }
function var2Handler()    { console.log("var2");    }
function var3Handler()    { console.log("var3");    }
function multiHandler()   { console.log("multi");   }

//initialise a table
const table = {true: {true: {}, false: {}}, false: {true: {}, false: {}}}

//fill it with values
table[false][false][false] = defaultHandler
table[false][false][true ] = var3Handler
table[false][true ][false] = var2Handler
table[false][true ][true ] = multiHandler
table[true ][false][false] = var1Handler
table[true ][false][true ] = multiHandler
table[true ][true ][false] = multiHandler
table[true ][true ][true ] = multiHandler

//simple resolver that takes the values and does the lookup
function resolve(var1, var2, var3) {
  return table[var1][var2][var3]();
}

resolve(false, false, false); // default
resolve(true , false, false); // var1
resolve(false, true , false); // var2
resolve(false, false, true ); // var3
resolve(true , true , false); // multi