问题描述
有 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 逻辑:
正如您所注意到的,只要有两个 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
。