我可以使用带有两个变量的 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|"
。虽然它并不出色,但我的回答假设您可以完全控制 var1
和 var2
。如果你假设你没有,你的答案是什么?
@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 不一定是整数。您的测试用例必须修改。哈希通常是switch
、else if
和
中最有效的选项。经常检查时,创建哈希的开销可以忽略不计。从长远来看,它的表现优于switch
和else 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 语句吗?的主要内容,如果未能解决你的问题,请参考以下文章
case/switch 语句的 Python 等效项是啥? [复制]