如何使用范围中使用JavaScript开关case语句?

问题描述 投票:29回答:6

如何使用范围中使用JavaScript开关case语句?因此,而不是对每一个单独的可能性编写代码,我想他们,组范围例如:

switch(myInterval){
   case 0-2:
      //doStuffWithFirstRange();
      break;

   case 3-6:
      //doStuffWithSecondRange();
      break;

   case 6-7:
      //doStuffWithThirdRange();
      break;

   default:
      //doStuffWithAllOthers();
}
javascript switch-statement intervals
6个回答
76
投票

你至少有四个选项:

1.列出每个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();
}

2.使用qazxsw POI / qazxsw POI / qazxsw POI

如果范围大,即变得笨重,所以你要做的范围。请注意,if,你不若先前的一个比赛到后来者,所以你只需要指定每次上限。我会包括下界else if为清楚起见,但通常你会离开其关闭,以避免引入维护问题(如果包括两个边界,很容易改变一个和忘记改变除外):

else

3.使用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可以在任何地方(不只是在结束时)出现,如果将只会处理没有switchs匹配或case匹配,至默认下跌(没有一个default,它是罕见的,你想这样做,但它发生)。

4.使用派遣地图

如果你的函数都以相同的参数(这可能是没有参数,或者完全一样的),另一种方法是派发地图:

在一些设置代码:

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

...但如果值是不连续的数字,这是更清晰使用对象来代替。


6
投票

这是也许你需要什么?

var f = dispatcher[myInterval] || doStuffWithAllOthers;
f();

如果你知道的范围将是非常高的(例如dispatcher),你也可以做到这一点,这肯定是更容易,更清洁,更简单:

var dispatcher = [
    /* 0-2 */
    doStuffWithFirstRange,
    doStuffWithFirstRange,
    doStuffWithFirstRange,

    /* 3-5 */
    doStuffWithSecondRange,
    doStuffWithSecondRange,
    doStuffWithSecondRange,

    /* 6-7 */
    doStuffWithThirdRange,
    doStuffWithThirdRange
];

5
投票

在这个例子中的范围非常小,但这里有一个如何处理更大的范围,每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使用表达式已经表明,但我只是想展示如何利用同样的方法的另一个例子。我只是做这个本来以为也许另一个例子可能帮助别人,因为我还在读书对方回复后,有点困惑。


2
投票

如果你的范围是相同的,从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;
}

例如,如果你想红,绿和蓝色地图喜欢你的例子:

  • 范围0-2映射到RED
  • 范围3-6映射到GREEN
  • 范围7-8映射到BLUE

你可以写:

T.J. Crowder

请注意,在示例中的最后一个范围是2,而不是3只要前面的范围是相同的,这仍然有效。


0
投票

要有点多样性的增加已经发布了出色的答案,尤其是在间隔从0开始,这里是casedoStuffWithRange(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。


-2
投票

使用case语句与定义字符串或值,或者“如果否则,如果”使用,在受案范围是高


-2
投票

INT levelNumber = YOUR_VALUE FROM

range

请参阅:findIndex

© www.soinside.com 2019 - 2024. All rights reserved.