如何使用范围中使用JavaScript开关case语句?因此,而不是对每一个单独的可能性编写代码,我想他们,组范围例如:
switch(myInterval){
case 0-2:
//doStuffWithFirstRange();
break;
case 3-6:
//doStuffWithSecondRange();
break;
case 6-7:
//doStuffWithThirdRange();
break;
default:
//doStuffWithAllOthers();
}
你至少有四个选项:
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
使用表达式:JavaScript是不寻常的,你可以使用表达式在/*...*/
语句,所以我们可以把上面的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
序列:
case
我不主张这一点,但它是在JavaScript中的一个选项,并有次它是有用的。该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();
}
s在源代码顺序进行处理,该case
可以在任何地方(不只是在结束时)出现,如果将只会处理没有switch
s匹配或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)();
针对特定dispatcher
值没有条目,然后调用它。
你可以打破成两行,使之更清楚一点:
doStuffWithAllOthers
我已经用了最大的灵活性的对象。你可以定义myInterval
像这样与你的具体的例子:
the curiously-powerful ||
operator
...但如果值是不连续的数字,这是更清晰使用对象来代替。
这是也许你需要什么?
var f = dispatcher[myInterval] || doStuffWithAllOthers;
f();
如果你知道的范围将是非常高的(例如dispatcher
),你也可以做到这一点,这肯定是更容易,更清洁,更简单:
var dispatcher = [
/* 0-2 */
doStuffWithFirstRange,
doStuffWithFirstRange,
doStuffWithFirstRange,
/* 3-5 */
doStuffWithSecondRange,
doStuffWithSecondRange,
doStuffWithSecondRange,
/* 6-7 */
doStuffWithThirdRange,
doStuffWithThirdRange
];
在这个例子中的范围非常小,但这里有一个如何处理更大的范围,每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();
}
通过使用JavaScript MDN Docs使用表达式已经表明,但我只是想展示如何利用同样的方法的另一个例子。我只是做这个本来以为也许另一个例子可能帮助别人,因为我还在读书对方回复后,有点困惑。
如果你的范围是相同的,从0开始,你可以做一些数学。
// 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
请注意,在示例中的最后一个范围是2,而不是3只要前面的范围是相同的,这仍然有效。
要有点多样性的增加已经发布了出色的答案,尤其是在间隔从0开始,这里是case
(doStuffWithRange(Math.floor(myInterval/range));
)的解决方案:
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));
}
因为findIndex
数组进行排序,Yeah ES6将匹配第一个。这取决于你如何命名的范围,从0或1说明,你可能需要在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();
}
删除第一个0。
使用case语句与定义字符串或值,或者“如果否则,如果”使用,在受案范围是高
INT levelNumber = YOUR_VALUE FROM
range
请参阅:findIndex