Включить диапазоны целых чисел в JavaScript

Я хочу сделать что-то вроде этого

    switch (this.dealer) {
        case 1-4: 
            // Do something.
            break;
        case 5-8: 
            // Do something.
            break;
        case 9-11: 
            // Do something.
            break;
        default:
            break;
    }

Каков правильный синтаксис для этого? Возможно ли это в JavaScript?

Итак, this.dealer - целое число, и если оно находится между этими значениями, сделайте что-нибудь.

Ответ 1

Вот еще один способ, которым я это понял:

var x = this.dealer;
switch (true) {
    case (x < 5):
        alert("less than five");
        break;
    case (x > 4 && x < 9):
        alert("between 5 and 8");
        break;
    case (x > 8 && x < 12):
        alert("between 9 and 11");
        break;
    default:
        alert("none");
        break;
}

Ответ 2

Приращение ответа MarvinLabs, чтобы сделать его более чистым:

var x = this.dealer;
switch (true) {
    case (x < 5):
        alert("less than five");
        break;
    case (x < 9):
        alert("between 5 and 8");
        break;
    case (x < 12):
        alert("between 9 and 11");
        break;
    default:
        alert("none");
        break;
}

Нет необходимости проверять нижний предел диапазона, потому что операторы break заставят выполнение пропускать оставшиеся случаи, поэтому к тому времени, когда выполнение будет проверяться, например. (x < 9), мы знаем, что значение должно быть 5 или больше.

Конечно, результат корректен, если случаи остаются в первоначальном порядке, и мы принимаем целочисленные значения (как указано в вопросе) - технически диапазоны находятся между 5 и 8.999999999999 или около того, поскольку все числа в js фактически удваиваются -значные числа с плавающей запятой.

Если вы хотите иметь возможность перемещать случаи вокруг или находить более читаемым, чтобы весь диапазон отображался в каждом случае, просто добавьте меньше или равную проверку для более низкого диапазона для каждого случая:

var x = this.dealer;
switch (true) {
    case (x < 5):
        alert("less than five");
        break;
    case (x >= 5 && x < 9):
        alert("between 5 and 8");
        break;
    case (x >= 9 && x < 12):
        alert("between 9 and 11");
        break;
    default:
        alert("none");
        break;
}

Имейте в виду, что это добавляет дополнительную точку человеческой ошибки - кто-то может попытаться обновить диапазон, но забывайте изменить его в обоих местах, оставив перекрытие или пробел, который не покрывается. например здесь случай 8 теперь не будет соответствовать чему-либо, когда я просто отредактирую случай, который использовался для соответствия 8.

    case (x >= 5 && x < 8):
        alert("between 5 and 7");
        break;
    case (x >= 9 && x < 12):
        alert("between 9 and 11");
        break;

Ответ 3

    switch(this.dealer) {
        case 1:
        case 2:
        case 3:
        case 4:
            // Do something.
            break;
        case 5:
        case 6:
        case 7:
        case 8:
            // Do something.
            break;
        default:
            break;
    }

Если вам не нравится последовательность дел, просто перейдите к операторам if/else if/else.

Ответ 4

Этот не требует оператора switch. Это намного clearer, более сжато и быстрее, чтобы просто использовать инструкции else...

var d = this.dealer;
if (1 <= d && d <= 11) { // making sure in range 1..11
    if (d <= 4) {
        alert("1 to 4");
    } else if (d <= 8) {
        alert("5 to 8");
    } else {
        alert("9 to 11");
    }
} else {
    alert("not in range");
}

Тест скорости

Мне было интересно узнать, как использовать коммутатор вместо простого, если... else..., поэтому я собрал jsFiddle для его изучения... http://jsfiddle.net/17x9w1eL/

  • Chrome: переключатель был примерно на 70% медленнее, чем if else

  • Firefox: переключатель был примерно на 5% медленнее, чем if else

  • IE: переключатель был примерно на 5% медленнее, чем if else

  • Safari: переключатель был примерно на 95% медленнее, чем if else

Примечания:

Назначение локальной переменной необязательно, особенно если ваш код будет автоматически оптимизирован позже.

Для числовых диапазонов мне нравится использовать такую ​​конструкцию...

if (1 <= d && d <= 11) {...}

... потому что для меня он читает ближе к тому, как вы выражаете диапазон в математике (1 <= d <= 11), и когда я читаю код, я могу прочитать это как "if d находится между 1 и 11".

Яснее

Несколько человек отметили, что они не считают это более ясным. Это, конечно, не менее понятно, поскольку структура близка к идентичной опции переключателя. Основной причиной, по которой он является более понятным, является то, что каждая его часть читаема и делает простой интуитивный смысл, тогда как "switch (true)" является довольно бессмысленной линией кода. Многие кодеры, читающие, что в вашем script, собираются пойти "WTF это значит?" а затем придется искать его. Это грязный хак, это не интуитивно, и это непонятно. Если вам нравится код, и никто больше не будет иметь дело с вашей базой кода, тогда идите на это, иначе лучше просто использовать конструкции для того, что они предназначены.

Ответ 5

Нет, это невозможно. Самое близкое, что вы можете получить, это:

  switch(this.dealer) {
    case 1:
    case 2:
    case 3:
    case 4:
                      // DO SMTHIN
        break;
    case 5:
    case 6:
    case 7:
    case 8:
                      // DO SMTHIN
       break;

Но это очень неуклюже.

Для таких случаев обычно лучше использовать структуру if/else if.

Ответ 6

Если вам нужны диапазоны проверок, вам, вероятно, будет лучше с операторами if и else if, например:

if (range > 0 && range < 5)
{
    // ..
}
else if (range > 5 && range < 9)
{
    // ..
}
else
{
    // Fall through
}

Переключатель может стать большим на больших диапазонах.

Ответ 7

Если вы пытаетесь сделать что-то быстро, эффективно и удобочитаемо, используйте стандартную, если... then... else структуру вроде этого:

var d = this.dealer;
if (d < 12) {
    if (d < 5) {
        alert("less than five");
    }else if (d < 9) {
        alert("between 5 and 8");
    }else{
        alert("between 9 and 11");
    }
}else{
    alert("none");
}

Если вы хотите запутать его и сделать его ужасным (но маленьким), попробуйте следующее:

var d=this.dealer;d<12?(d<5?alert("less than five"):d<9?alert("between 5 and 8"):alert("between 9 and 11")):alert("none");

Кстати, приведенный выше код - это JavaScript, если... then... else сокращенное утверждение. Это отличный пример того, как НЕ писать код, если целью является обфускация или кодирование кода. Имейте в виду, что обслуживание кода может быть проблемой, если оно написано таким образом. Очень немногие люди могут легко прочитать его, если вообще. Размер кода, однако, на 50% меньше стандартного, если... тогда... еще без потери производительности. Это означает, что в больших кодовых версиях такая минимизация может значительно ускорить доставку кода через сети с ограниченной пропускной способностью или с высокой задержкой.

Это, однако, не следует считать хорошим ответом. Это всего лишь пример того, что МОЖЕТ быть сделано, а не того, что ДОЛЖНО быть сделано.

Ответ 8

Более читаемая версия тройки может выглядеть так:

var x = this.dealer;
alert(t < 1 || t > 11
  ? 'none'
    : t < 5
  ? 'less than five'
    : t <= 8
  ? 'between 5 and 8'
  : 'Between 9 and 11');

Ответ 9

function sequentialSizes(val) {
 var answer = "";

 switch (val){
case 1:
case 2:
case 3:
case 4:
  answer="Less than five";
  break;
case 5:
case 6:
case 7:
case 8:
  answer="less than 9";
  break;
case 8:
case 10:
case 11:
  answer="More than 10";
  break;
 }

return answer;  
}

// Change this value to test you code to confirm ;)
sequentialSizes(1);