如何在使用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”,以防范围较高