Как использовать диапазоны в операторе 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
. (и опять же, нижние границы могут быть опущены во многих случаях, потому что они соответствовали бы ранее.) хотя case
s обрабатываются в порядке исходного кода,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", если диапазон выше