简化 switch 语句 [关闭]

Posted

技术标签:

【中文标题】简化 switch 语句 [关闭]【英文标题】:Simplify switch statement [closed] 【发布时间】:2021-04-11 12:11:39 【问题描述】:

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

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

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')
 

【问题讨论】:

我不知道你所说的“它不能很好地工作”是什么意思。您能否提供一些示例输入以及预期输出和您当前获得的输出?见minimal reproducible example。 【参考方案1】:

将其编码到一个简单的真值表中

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

【讨论】:

出色的解决方案。但它真的简化了 OP 的 switch 语句吗? @AbsoluteBeginner 是的。根本不需要做任何条件逻辑,一旦所有的排列都被编码在一个表中,那么绝对清楚什么是做什么的。我实际上不确定如果所有三个都是true,OP 是否希望发生一些不同的事情,但现在如果需要更改它是微不足道的,而无需添加不同的布尔条件并确保它不重叠并且不被任何事物所笼罩。此外,阅读代码毫无疑问会在任何特定情况下发生什么。它更简单,因为这里没有什么可真正考虑的。 感谢您的回答。我学到了一些新东西。【参考方案2】:

试试这个

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')
 

【讨论】:

有什么办法可以简化这个吗? (var1 && var2) || (var1 && var3) || (var2 && var3) if ((var1 + var2+ var3) === 2)【参考方案3】:

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

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

@EVeras 解决方案也可以。

【讨论】:

【参考方案4】:

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');

【讨论】:

【参考方案5】:

也许我们可以试试这个:

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 输入 XOR 逻辑:

为了便于理解,这里是图片:

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

【讨论】:

!(var1 ^ var2 ^ var3)的一点解释?

以上是关于简化 switch 语句 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

c++ 程序是不是可以在 if/else 语句中包含 switch 语句[关闭]

ECMAScript语句之《switch 语句》

优化:switch 语句中的 case 顺序重要吗? [关闭]

为啥 switch 语句不向应用返回信息? [关闭]

python之switch语句,优化多个if语句

switch case的用法