Ответ 1
У вас есть как минимум четыре варианта:
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
обрабатываются в порядке исходного кода, 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
];
... но если значения не являются смежными числами, гораздо проще использовать объект.