我可以使用带有两个变量的 case/switch 语句吗?

Posted

技术标签:

【中文标题】我可以使用带有两个变量的 case/switch 语句吗?【英文标题】:Can I use a case/switch statement with two variables? 【发布时间】:2012-03-03 08:34:43 【问题描述】:

我是 javascript 的新手,我的理解是使用一个 SWITCH/CASE 语句比使用一大堆 IF 语句要快。

但是,我想使用带有两个变量的 SWITCH/CASE 语句。

我的网络应用有两个滑块,每个滑块有五个状态。我希望行为基于这两个变量的状态。显然,这是一大堆 IF/THEN 语句。

我想到的一种方法是将两个变量连接成一个,然后我可以 SWITCH/CASE 那个。

有没有更好的方法来完成使用两个变量的 SWITCH/CASE ?

谢谢!

【问题讨论】:

这些变量中有什么?数字?字符串? 25 个 case 表达式?!这种方法将是巨大的。 :-o 你确定你需要所有 25 个状态的单独逻辑吗? 如果您有很多选择,那么简单地将它们连接到var1|var2 之类的东西可能是一种非常快速的方法。我们需要看一些你正在做的事情的例子...... 可能有更好的方法来解决您的问题。如果您向我们提供有关实际问题的更多信息,您可能会得到很多很棒的建议:) 其实有点复杂。我正在做的是使用 ArcGIS Javascript API,并且根据滑块的位置显示不同的地图。我真正想做的是使用滑块进行一些计算然后根据这些计算显示地图,但结果并不那么热门。 【参考方案1】:
var var1 = "something";
var var2 = "something_else";
switch(var1 + "|" + var2) 
    case "something|something_else":
        ...
        break;
    case "something|...":
        break;
    case "...|...":
        break;

如果每一种有 5 种可能性,您将获得 25 个案例。

【讨论】:

这以及这里的所有其他答案都非常可怕。正确答案是使用if... 考虑var1 = "something|something_else";var2 = "";的情况 @BrianHannay 插入了一个额外的|,大小写必须是"something|something_else|"。虽然它并不出色,但我的回答假设您可以完全控制 var1var2。如果你假设你没有,你的答案是什么? @Halcyon 我不相信有很好的方法可以做到这一点,但是嵌套的 switch 语句(带有变量选项)可以工作。我只是想不出第二个滑块(在 OP 的问题中)产生的动作将取决于第一个滑块的值的情况。 @BlueRaja-DannyPflughoeft 如此真实 :)【参考方案2】:

我不相信 switch/case 比一系列 if/elseif 更快。他们做同样的事情,但如果/其他你可以检查多个变量。您不能在多个值上使用 switch/case。

【讨论】:

【参考方案3】:

首先,JavaScript's switch is no faster than if/else (and sometimes much slower)。

其次,将switch 与多个变量一起使用的唯一方法是将它们组合成一个原始值(字符串、数字等):

var stateA = "foo";
var stateB = "bar";
switch (stateA + "-" + stateB) 
    case "foo-bar": ...
    ...

但是,就我个人而言,我更希望看到一组 if/else 语句。

编辑:当所有值都是整数时,在 Chrome 中 switch 的性能似乎优于 if/else。见 cmets。

【讨论】:

重复相同的测试,但使用。比如说,100 例。差异将变得明显。 啊,在我的浏览器上,当切换的值为整数时,您似乎是正确的:jsperf.com/switch-ifelse-map/3 不一定是整数。您的测试用例必须修改。哈希通常是switchelse if 中最有效的选项。经常检查时,创建哈希的开销可以忽略不计。从长远来看,它的表现优于switchelse if 哦,疯了,但我的数字测试用例似乎被我的字符串测试用例覆盖了。无论如何,数字更快,字符串是相同的。 嗨,David,谢谢,能够比较 switch 与 if/else 并通过整数和字符串进行比较真是太棒了。 FF9.01 似乎 switch 和 integer 最快【参考方案4】:

您可以为每个滑块上的每个位置指定一个从 1 到 1000000000 的不同二进制值 然后使用总和。

【讨论】:

【参考方案5】:

按位运算符怎么样?您正在处理的不是字符串,而是“枚举”,它看起来更“优雅”。

// Declare slider's state "enum"
var SliderOne = 
    A: 1,
    B: 2,
    C: 4,
    D: 8,
    E: 16
;

var SliderTwo = 
    A: 32,
    B: 64,
    C: 128,
    D: 256,
    E: 512
;

// Set state
var s1 = SliderOne.A,
    s2 = SliderTwo.B;

// Switch state
switch (s1 | s2) 
    case SliderOne.A | SliderTwo.A :
    case SliderOne.A | SliderTwo.C :
        // Logic when State #1 is A, and State #2 is either A or C
        break;
    case SliderOne.B | SliderTwo.C :
        // Logic when State #1 is B, and State #2 is C
        break;
    case SliderOne.E | SliderTwo.E :
    default:
        // Logic when State #1 is E, and State #2 is E or
        // none of above match
        break;



不过,我同意其他人的观点,switch-case 逻辑中的 25 个 case 不太漂亮,并且 if-else 在某些情况下可能“看起来”更好。无论如何。

【讨论】:

|或双|| ? 单身。我们在这里谈论“按位或”。参考:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… 当枚举未在位范围内定义时,这是行不通的,所以这是一个误导性的指令。【参考方案6】:

如果每个组合的动作都是静态的,你可以构建一个二维数组:

var data = [
  [1,2,3,4,5],
  [6,7,8,9,10],
  [11,12,13,14,15],
  [16,17,18,19,20],
  [21,22,23,24,25]
];

上面示例中的数字可以是任何东西,例如字符串、数组等。现在获取值是单行的(假设滑块的值范围为 [0,5):

var info = data[firstSliderValue][secondSliderValue];

【讨论】:

【参考方案7】:

是的,但不是以正常方式。你必须使用 switch 作为闭包。

例如:-

function test(input1, input2) 
     switch (true) 
        case input1 > input2:
                    console.log(input1 + " is larger than " + input2);
                    break;
        case input1 < input2:
                    console.log(input2 + " is larger than " + input1);
        default:
                    console.log(input1 + " is equal to " + input2);
      
   

【讨论】:

【参考方案8】:

是的,你也可以这样做:

    switch (true) 

     case (var1 === true && var2 === true) :
       //do something
       break;
     case (var1 === false && var2 === false) :
       //do something
       break;

      default:

    

这将始终执行切换,与 if/else 非常相似,但看起来更简洁。只需继续检查 case 表达式中的变量即可。

【讨论】:

【参考方案9】:

像 scala&python 这样的语言为你提供了非常强大的东西,比如 patternMatching,不幸的是,这仍然是 Java 中缺少的功能......

但是有一个解决方案(在大多数情况下我不喜欢),你可以这样做:

final int s1Value = 0;
final int s2Value = 0;
final String s1 = "a";
final String s2 = "g";

switch (s1 + s2 + s1Value + s2Value)
    case "ag00": return true;
    default: return false;

【讨论】:

【参考方案10】:

我是这样做的:

switch (valueA && valueB) 

case true && false:
console.log(‘valueA is true, valueB is false’)
break;

case ( true || false ) && true:
console.log(‘valueA is either true or false and valueB is true’)
break;

default:
void 0;

【讨论】:

以上是关于我可以使用带有两个变量的 case/switch 语句吗?的主要内容,如果未能解决你的问题,请参考以下文章

switch...case语句嵌套问题

case/switch 语句的 Python 等效项是啥? [复制]

使用 Case/Switch 和 GetType 来确定对象 [重复]

c语言中CASE 问题?

使用带有两个变量的 for 循环

带有变量的 C 数组声明? [复制]