如何在使用JavaScript的switch case语句中使用范围?
如何在使用JavaScript的switch case语句中使用范围? 所以,我不想为每一种可能性编写代码,而是希望将它们分组在范围内,例如:
switch(myInterval){ case 0-2: //doStuffWithFirstRange(); break; case 3-6: //doStuffWithSecondRange(); break; case 6-7: //doStuffWithThirdRange(); break; default: //doStuffWithAllOthers(); }
你至less有四个select:
1.列出每个case
如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(); }
2.使用if
/ else if
/ else
如果范围很大,就会变得笨重,所以你想要做范围。 请注意, if...else if...else if
,如果前面的匹配,则不会到达后面的那个,所以每次只需指定上限。 为了清楚起见,我会在/*...*/
join下限,但是通常情况下,您/*...*/
引入维护问题(如果同时包含这两个边界,则可以很容易地更改一个而忘记更改另一个) :
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(); }
3.用expression式的用case
:
JavaScript是不寻常的,因为你可以在case
语句中使用expression式,所以我们可以把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的一个选项,有时候它是有用的。 按照您在switch
给出的值对case
语句进行检查。 (同样,下界在许多情况下可能会被省略,因为它们会早些时候匹配)。即使cases是以源代码的顺序处理的, default
可以出现在任何地方(不只是在结尾处),并且只在要么没有匹配的case
要么匹配的case
,通过默认(没有break
,这是罕见的,你想这样做,但它发生)。
4.使用调度图
如果你的函数都采用相同的参数(可能不是参数,或者只是相同的参数),另一种方法是调度映射:
在一些设置代码中:
var dispatcher = { 0: doStuffWithFirstRange, 1: doStuffWithFirstRange, 2: doStuffWithFirstRange, 3: doStuffWithSecondRange, 4: doStuffWithSecondRange, 5: doStuffWithSecondRange, 6: doStuffWithThirdRange, 7: doStuffWithThirdRange };
然后,而不是开关:
(dispatcher[myInterval] || doStuffWithAllOthers)();
通过查找调用dispatcher
映射的函数来工作,如果没有用特定的myInterval
值使用奇怪的强大的||
,那么默认为doStuffWithAllOthers
运算符 ,然后调用它。
你可以把它分成两行,使之更清晰:
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(); }
如果你的范围是相同的,从0开始,你可以做一些math。
doStuffWithRange(Math.floor(myInterval/range));
例如,如果你想像你的例子那样使用RED,GREEN和BLUE,
- 范围0-2映射到RED
- 范围3-6映射到绿色
- 范围7-8映射到蓝色
你可以写:
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,只要前面的范围相同,这个范围仍然有效。
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; }
用case语句定义string或值,或使用“if else if”,以防范围较高