如何使用JavaScript在switch case语句中使用范围?

Lav*_*oos 30 javascript intervals switch-statement

如何使用JavaScript在switch case语句中使用范围?因此,我不想为每种可能性编写代码,而是将它们分组到范围中,例如:

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

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

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

   default:
      //doStuffWithAllOthers();
}
Run Code Online (Sandbox Code Playgroud)

T.J*_*der 78

您至少有四个选择:

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();
}
Run Code Online (Sandbox Code Playgroud)

2.使用if/ else if/else

如果范围很大,那就太笨重了,所以你想做范围.请注意,if...else if...else if如果较早的匹配,则不会使用后者,因此您只需每次都指定上限./*...*/为了清晰起见,我将包括下限,但通常你会将其保留以避免引入维护问题(如果包含两个边界,则很容易更改一个而忘记更改另一个):

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();
}
Run Code Online (Sandbox Code Playgroud)

3.用于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();
}
Run Code Online (Sandbox Code Playgroud)

我不是在提倡这一点,但它 JavaScript中的一个选项,有时它很有用.将按照您在中提供的值的顺序case检查语句.(同样,在很多情况下可以省略下限,因为它们之前会匹配.)即使s按源代码顺序处理,也可以出现在任何地方(不仅仅是在结尾),只有在没有时才会处理s匹配或匹配并跌至默认值(没有;你很少想要这样做,但它会发生).switchcasedefaultcasecasebreak

4.使用调度图

如果你的函数都采用相同的参数(并且可能没有参数,或者只是相同的参数),另一种方法是调度映射:

在一些设置代码中:

var dispatcher = {
    0: doStuffWithFirstRange,
    1: doStuffWithFirstRange,
    2: doStuffWithFirstRange,

    3: doStuffWithSecondRange,
    4: doStuffWithSecondRange,
    5: doStuffWithSecondRange,

    6: doStuffWithThirdRange,
    7: doStuffWithThirdRange
};
Run Code Online (Sandbox Code Playgroud)

然后代替开关:

(dispatcher[myInterval] || doStuffWithAllOthers)();
Run Code Online (Sandbox Code Playgroud)

这通过查找函数来调用dispatcher地图,默认为使用奇怪强大的运算符doStuffWithAllOthers没有该特定myInterval值的条目,然后调用它.||

您可以将其分为两行以使其更清晰:

var f = dispatcher[myInterval] || doStuffWithAllOthers;
f();
Run Code Online (Sandbox Code Playgroud)

我使用了一个物体来获得最大的灵活性.你可以dispatcher用你的具体例子定义:

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

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

    /* 6-7 */
    doStuffWithThirdRange,
    doStuffWithThirdRange
];
Run Code Online (Sandbox Code Playgroud)

...但如果值不是连续的数字,则使用对象会更清楚.


Nic*_*ngo 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();
}
Run Code Online (Sandbox Code Playgroud)

如果您知道范围非常高(例如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();
}
Run Code Online (Sandbox Code Playgroud)


twk*_*nab 5

此示例中的范围很小,但是根据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;
}
Run Code Online (Sandbox Code Playgroud)

我知道TJ Crowder已经通过“ 与表达式一起使用”case显示了这种样式,但是我只是想展示另一个示例,说明如何利用这种方法。我只是这样做,并以为其他示例可能会对某人有所帮助,因为在阅读其他回复后我仍然有些困惑。