如何使用JavaScript在switch case语句中使用范围?因此,我不想为每一种可能性编写代码,而是将它们分组到范围中,例如:
switch(myInterval){
case 0-2:
//doStuffWithFirstRange();
break;
case 3-6:
//doStuffWithSecondRange();
break;
case 6-7:
//doStuffWithThirdRange();
break;
default:
//doStuffWithAllOthers();
}
答案 0 :(得分:74)
您至少有四个选择:
case
作为shown by LightStyle,您可以明确列出每个案例:
switch(myInterval){
case 0:
case 1:
case 2:
doStuffWithFirstRange();
break;
case 3:
case 4:
case 5:
doStuffWithSecondRange();
break;
case 6:
case 7:
doStuffWithThirdRange();
break;
default:
doStuffWithAllOthers();
}
if
/ else if
/ else
如果范围很大,那就太笨重了,所以你想做范围。请注意,对于if...else if...else if
,如果较早的匹配,则不会访问后者,因此您只需每次都指定上限。为了清楚起见,我将在/*...*/
中包含下限,但通常你会将其保留以避免引入维护问题(如果包含两个边界,则很容易更改一个而忘记更改另一个):< / p>
if (myInterval < 0) {
// I'm guessing this is an error
}
else if (/* myInterval >= 0 && */ myInterval <= 2){
doStuffWithFirstRange();
}
else if (/* myInterval >= 3 && */ myInterval <= 5) {
doStuffWithSecondRange();
}
else if (/* myInterval >= 6 && */ myInterval <= 7) {
doStuffWithThirdRange();
}
else {
doStuffWithAllOthers();
}
case
与表达式一起使用: JavaScript很不寻常,因为您可以在case
语句中使用表达式,因此我们可以将上面的if...else if...else if
序列写为switch
语句:
switch (true){
case myInterval < 0:
// I'm guessing this is an error
break;
case /* myInterval >= 0 && */ myInterval <= 2:
doStuffWithFirstRange();
break;
case /* myInterval >= 3 && */ myInterval <= 5:
doStuffWithSecondRange();
break;
case /* myInterval >= 6 && */ myInterval <= 7:
doStuffWithThirdRange();
break;
default:
doStuffWithAllOthers();
}
我不是在提倡这一点,但 是JavaScript中的一个选项,有时它很有用。 case
语句将按照<{1>}中提供的值按顺序进行检查。 (同样,在很多情况下可以省略下限,因为它们之前会匹配。)即使switch
以源代码顺序处理,case
也是如此。可以出现在任何地方(不仅仅是在结尾),只有在default
匹配或case
匹配并且达到默认值(没有case
时才会被处理;很少你想这样做,但它发生了。)
如果你的函数都采用相同的参数(并且可能没有参数,或者只是相同的参数),另一种方法是调度图:
在某些设置代码中:
break
然后代替开关:
var dispatcher = {
0: doStuffWithFirstRange,
1: doStuffWithFirstRange,
2: doStuffWithFirstRange,
3: doStuffWithSecondRange,
4: doStuffWithSecondRange,
5: doStuffWithSecondRange,
6: doStuffWithThirdRange,
7: doStuffWithThirdRange
};
通过查找要在(dispatcher[myInterval] || doStuffWithAllOthers)();
地图上调用的函数,如果使用the curiously-powerful ||
operator没有针对该特定dispatcher
值的条目,则默认为doStuffWithAllOthers
。叫它。
你可以把它分成两行,使它更清晰:
myInterval
我使用了一个对象以获得最大的灵活性。您可以使用您的具体示例 来定义var f = dispatcher[myInterval] || doStuffWithAllOthers;
f();
:
dispatcher
...但如果值不是连续数字,则使用对象会更清楚。
答案 1 :(得分:6)
这可能是你需要的吗?
switch(myInterval){
case 0:
case 1:
case 2:
//doStuff();
break;
case 3:
case 4:
case 5:
case 6:
//doStuff();
break;
case 6:
case 7:
//doStuff();
break;
default:
//doStuff();
}
如果您知道范围非常高(例如0-100
),您也可以这样做,这肯定更容易,更清洁,更简单:
if (myInterval >= 0 && myInterval <= 20) {
//doStuff();
} else if (myInterval > 20 && myInterval <= 60) {
//doStuff();
} else if (myInterval > 60 && myInterval <= 70) {
//doStuff();
} else /* it is greater than 70 */ {
//doStuff();
}
答案 2 :(得分:4)
此示例中的范围非常小,但根据JavaScript MDN Docs,可以按照以下方式处理更大的范围:
// The value we'll be evaluating:
let code = 100;
// Matches for any case where the expression === `true`:
switch (true) {
case code <= 64:
return "Your number is 64 or less!";
break;
case code >= 65 && code <= 90:
return "Your number is in the range of 65-90!";
break;
case code >= 97 && code <= 122:
return "Your number is in the range of 97-122!";
break;
case code >= 123:
return "Your number is 123 or greater!";
break;
default:
break;
}
我知道T.J. Crowder已经通过 使用带有表达式的<{1}} 显示了这种风格,但我只想展示另一个示例如何利用同样的方法。我刚刚做了这个,并且想到也许另一个例子可能对某人有所帮助,因为在阅读其他回复后我仍然有点困惑。
答案 3 :(得分:2)
如果您的范围相同且从0开始,您可以进行一些数学运算。
doStuffWithRange(Math.floor(myInterval/range));
例如,如果您希望RED,GREEN和BLUE成为地图,例如:
你可以写:
function colorInterval(n, max) {
var colors = ["RED", "GREEN", "BLUE"];
var range = max/colors.length
return colors[Math.floor(n/range)];
}
//You get 3 of RED, 3 of GREEN, 2 of BLUE
for (var i=0; i<8; i++) {
console.log(colorInterval(i, 8));
}
请注意,示例中的最后一个范围是2,而不是3,只要先前的范围相同,这仍然有效。
答案 4 :(得分:0)
要为已发布的出色答案(特别是当间隔以0开头)增加一点多样性,这里是一种findIndex
(Yeah ES6)的解决方案:
const range = [0, 2, 6, 7];
const randeIndex = range.findIndex(threshold => myInterval <= threshold);
switch (rangeIndex) {
case 1:
//doStuffWithFirstRange();
break;
case 2:
//doStuffWithSecondRange();
break;
case 3:
//doStuffWithThirdRange();
break;
default:
//doStuffWithAllOthers();
}
因为range
数组是有序的,所以findIndex
将匹配第一个。根据您命名范围的方式,从0或1开始,您可能需要删除range
中的前0。
答案 5 :(得分:-2)
使用带有已定义字符串或值的case语句或使用“if else if”,以防范围更高
答案 6 :(得分:-2)
int levelNumber = YOUR_VALUE FROM
NSString* strMessage;
switch (levelNumber) {
case 1...10:
{
// Do something...
break;
}
case 11...20:
{
// Do something...
break;
}
case 21...30:
{
// Do something...
break;
}
case 31...40:
{
// Do something...
break;
}
default:
break;
}
<强>参见:强> https://www.codingexplorer.com/loops-switch-statements-ranges-swift/