简化 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
可以强制转换为1
,false
可以强制转换为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
有 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
可以强制转换为1
,false
可以强制转换为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