简化switch语句

问题描述

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

解决方法

用简单的真值表编码

var1 var2 var3 结果
默认
真实 var3
真实 var2
真实 真实
真实 var1
真实 真实
真实 真实
真实 真实 真实

现在你可以很容易地在代码中做同样的事情,然后为不同的条件附加不同的处理程序。整个逻辑变成了一个非常简单的查找:

//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); // var1
resolve(false,true,false); // var2
resolve(false,true ); // var3
resolve(true,false); // multi

,

试试这个

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 解决方案也可以。

,

Pattern.propTypes = { width: PropTypes.number.isRequired,} 可以强制转换为 true,而 1 可以强制转换为 false,因此您可以直接将布尔值相加,看看有多少是真的。此外,您可以直接使用 0 语句而不是打开 if

true
,

也许我们可以试试这个:

warped_image[0,2] = image[0,1] + image[1,1] = 51

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

这是为了清楚理解的图像: enter image description here

正如您所注意到的,只要有两个 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'); } ,结果就会为假(因此 true)。但是当它们都为 ! 时,它会失败,如带红色框的快照所示。为此,我们将不得不单独处理,然后解决方案将不会保持优雅。所以这个解决方案是false