предохранители в переключателе вместе / упрощают случаи в коммутаторе - возможно ли это? [Дубликат]

Я хотел бы добавить одну вещь к отличному ответу chazomaticus :

Не забудьте также тег META (например, или HTML4 или XHTML-версия этого файла ):


Это кажется тривиальным, но IE7 дал мне проблемы с этим раньше.

Я делал все правильно; база данных, соединение с базой данных и HTTP-заголовок Content-Type были настроены на UTF-8, и она отлично работала во всех других браузерах, но Internet Explorer по-прежнему настаивал на использовании «западноевропейской» кодировки.

It оказалось, что на странице отсутствует метка META. Добавление этого решения проблемы.

Правка:

У W3C фактически есть довольно большой раздел , посвященный I18N . У них есть ряд статей, связанных с этой проблемой & ndash; описывая HTTP, (X) HTML и CSS сторону вещей:

Они рекомендуют использовать как HTTP-заголовок, так и HTML метатег (или объявление XML в случае XHTML служил XML).

24
задан Lave Loos 17 June 2013 в 12:41
поделиться

6 ответов

У вас есть как минимум четыре варианта:

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

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();
}

Я не сторонник этого, но он является вариантом в JavaScript, и иногда это полезно. Операторы case проверяются в порядке от значения, которое вы даете в switch. (И снова нижние границы могут быть опущены во многих случаях, потому что они бы соответствовали ранее.) Несмотря на то, что case s обрабатываются в порядке исходного кода, default может отображаться в любом месте ( а не только в конце) и обрабатывается только в том случае, если либо нет case s, либо 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
];

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

70
ответ дан Community 28 August 2018 в 15:37
поделиться

Использовать аргумент case с определенной строкой или значением или использовать «if else if», если диапазон выше

-2
ответ дан hungryMind 28 August 2018 в 15:37
поделиться

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

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

Например, если вы хотите использовать RED, GREEN и BLUE на карте, например, ваш пример:

  • Диапазон 0-2 соответствует RED
  • Диапазон 3-6 соответствует GREEN
  • Диапазон 7-8 отображает значение BLUE

Вы можете написать:

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, и это все еще работает до тех пор, пока предыдущие диапазоны совпадают.

2
ответ дан iamdimitar 28 August 2018 в 15:37
поделиться

Возможно, это вам нужно?

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();
}
6
ответ дан Niccolò Campolungo 28 August 2018 в 15:37
поделиться

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;
}
1
ответ дан Sandip Patel - SM 28 August 2018 в 15:37
поделиться

Диапазоны в этом примере довольно малы, но вот как можно обрабатывать большие диапазоны, на 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;
}

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

2
ответ дан twknab 28 August 2018 в 15:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: