Как использовать диапазоны в операторе switch case с помощью JavaScript?

Как я могу использовать диапазоны в операторе switch case с помощью JavaScript? Поэтому вместо написания кода для каждой возможности я хотел бы сгруппировать их в диапазоны, например:

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

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

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

   default:
      //doStuffWithAllOthers();
}

6 ответов


у вас есть по крайней мере четыре варианта:

1. Перечислите каждый case

As показано 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, вы не добираетесь до более поздних, если более ранний совпадает, поэтому вам нужно только указать верхнюю границу каждый раз. Я включу нижняя граница в /*...*/ для ясности, но обычно вы оставляете его, чтобы избежать введения проблемы обслуживания (если вы включаете обе границы, легко изменить одну и забыть изменить другую):

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. Использовать 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();
}

я не выступаю за это, но это is опция в JavaScript, и иногда это полезно. The case заявления проверяются в целях против значения, которое вы даете в switch. (и опять же, нижние границы могут быть опущены во многих случаях, потому что они соответствовали бы ранее.) хотя 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 карта, по умолчанию doStuffWithAllOthers если нет записи для этого конкретного myInterval значение с помощью удивительно-мощный || оператор, а затем вызвать его.

вы можете разбить это на две строки, чтобы сделать его немного яснее:

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:

// 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;
}

Я знаю, что этот стиль уже был показан Ти Джей Краудер via использовать case с выражениями, но я просто хотел показать еще один пример, как использовать этот же метод. Я просто сделал это и подумал, может быть, другой пример может помочь кому-то, так как я все еще был немного смущен после прочтения других ответов.


Если ваши диапазоны одинаковы и начинаются с 0 можно сделать кое-какие подсчеты.

doStuffWithRange(Math.floor(myInterval/range));

например, если вы хотите красный, зеленый и синий на карте, как ваш пример:

  • диапазон 0-2 карты красный
  • диапазон 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 с определенной строкой или значением или используйте "if else if", если диапазон выше