高级switch case

5

我想在switch case语句中使用一个变量,例如,我无法做到这一点。你能帮忙吗?

switch(basket,pay){
   case true, true:
       blah blah...
   break;
   case false,true:
       blah blah..
   break;
   case false, false:
      blah blah...
   break;
}

你只能开启一个值 - 购物篮或支付(不能同时开启) - Kane
5个回答

11

你需要的是标志位和位掩码。基本上,你可以将多个伪布尔值存储在同一个变量中,并访问它们的组合条件。这个方法的好处在于可以将多个属性组合成一个变量。当需要跟踪大量布尔属性时,这种方法非常方便。

var FLAG_BASKET = 0x1; // 0001  
var FLAG_PAY = 0x2; // 0010

//set them both to pseudo-true
var flags = FLAG_BASKET | FLAG_PAY;

switch (flags){
  case 0x0://both are false
  case 0x1://basket is true, pay is false
  case 0x2://basket is false, pay is true
  case 0x3://both are true
}

已经调试好了


6

原始问题可以使用 switch 来编写:

switch (true) {
    case basket && pay:
    // both true
    break;
    case basket && !pay: 
    // basket true, pay false
    break;
    case !basket && pay:
    // basket false, pay true
    break;
    case !basket && !pay:
    // basket false, pay false
    break;
}

说得好! 这是一个非常优雅的设计,谢谢! 应该将其标记为答案。 - 255.tar.xz

2
你所写的是合法的JavaScript代码,但它并不会按照你的期望执行。
在表达式中,逗号的作用是将其后面的最后一个成员作为结果返回。这在for循环中常用于同时初始化两个变量:
for(var i = 0, l = myArray.length; i < l; ++i) {
    ...
}

当你在switch和case语句中使用逗号运算符时,第一个值会被丢弃,最后一个值会被使用。查看这个fiddle的示例:http://jsfiddle.net/UG4vf/ 它并不会比较两个值并找到匹配它们的case。换句话说,你上面的代码等同于这个:
switch(pay){
   case true:
       blah blah...
   break;
   case true:
       blah blah..
   break;
   case false:
      blah blah...
   break;
}

2

老实说,你的switch语句似乎并不必要。只需使用一些简单的if语句即可:

if (basket && pay) {
  // code
} else if (pay) {
  // code
} else {
  // code
}

根据他们提供的示例,这是最合适的答案(也是最容易阅读的)。 - JonWarnerNet

0

使用这个解决方案,您可以向开关提供多个参数:

const a = "foo";
const b = true;
const c = null;

const condition = JSON.stringify({ a, b, c });

function mySwitch(condition) {
  switch (condition) {
    case JSON.stringify({
      a: "foo",
      b: true,
      c: true
    }):
      return 'case { a: "foo", b: true, c: null }';

    case JSON.stringify({
      a: "foo",
      b: true,
      c: null
    }):
      return 'case { a: "foo", b: true, c: null }';

    default:
      return 'default';
  }
}

console.log("condition:", condition);
console.log("result:", mySwitch(condition));

除了对象作为条件,数组也可以使用,但是使用此解决方案的缺点是必须将完整的开关条件值传递给开关情况条件。例如,如果开关情况关心示例中的属性ab而不是c,则此解决方案将无法工作。但是,如果您确定c对于您的情况始终具有特定值,则可以使用此解决方案。

由于OP的示例代码包括每个情况的重复参数数量,因此此解决方案可能会帮助您在开关中提供多个参数的可能性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接