在es6中使用destructuring switch语句

时间:2018-01-06 16:23:59

标签: javascript if-statement ecmascript-6 switch-statement destructuring

有没有办法在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{
        ...
    }
}

3 个答案:

答案 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");
}