有没有办法在switch ... case语句中使用解构功能而不是使用嵌套的if else语句?
例如我希望这样的事情:
const tall = true;
const clean = true;
switch ([tall, clean]) {
case [true,true]:
console.log("Perfect");
break;
case [false,true]:
console.log("Ok");
break;
case [true,false]:
console.log("Not so good");
break;
default:
console.log("Terrible");
}
而不是使用:
if (tall){
if (clean){
...
}else{
...
}
}else{
if (clean){
...
}else{
...
}
}
答案 0 :(得分:4)
不,这与解构没有关系,不,你不能在switch
语句中使用数组文字,因为不同的对象永远不会相等。
你可以做的是将你的两个布尔值映射到整数得分:
switch (clean * 2 + tall) {
case 3:
console.log("Perfect");
break;
case 2:
console.log("Ok");
break;
case 1:
console.log("Not so good");
break;
case 0:
console.log("Terrible");
}
或等效数组查找:
console.log(["Terrible", "Not so good", "Ok", "Perfect"][clean * 2 + tall]);
你甚至可能想让按位魔术变得更加明显:
switch (tall << 1 | clean << 0) {
case true << 1 | true << 0:
console.log("Perfect");
break;
case false << 1 | true << 0:
console.log("Ok");
break;
case true << 1 | false << 0:
console.log("Not so good");
break;
case false << 1 | false << 0:
console.log("Terrible");
break;
}
您还可以在function score(a, b) { return a << 1 | b << 0 }
和switch
中呼叫帮助case
。
答案 1 :(得分:1)
实际上,您只能在switch语句中使用文字,并且不能将原始对象用作数组中的键,因此您无法进行如下映射:
{[true,true]: 'Perfect'
...}
太糟糕了。我想知道是否有语言可以将列表/数组作为字典键。
我仍然可能想做类似的事情,我觉得它很可读(尽管它可能会在代码审查中被拒绝!):
function hashKey([tall, clean]) {
return `${tall}_${clean}`
}
let valMap = {
'true_true': 'Perfect',
'false_true': 'Ok',
'true_false': 'Not so good',
'false_false': 'Terrible'
}
console.log(valMap[hashKey([true, true ])])
答案 2 :(得分:-3)
可以执行以下操作:
const tall = true;
const clean = false;
switch (true) {
case tall && clean:
console.log("Perfect");
break;
case !tall && clean:
console.log("Ok");
break;
case tall && !clean:
console.log("Not so good");
break;
default:
console.log("Terrible");
}