Простите за глупый вопрос. Как я могу использовать условие для случая в элементе языка javascript switch-case? Как и в примере ниже, регистр должен совпадать, если переменная liCount
<= 5 и> 0; однако мой код не работает:
switch (liCount) {
case 0:
setLayoutState('start');
var api = $('#UploadList').data('jsp');
api.reinitialise();
break;
case (liCount<=5 && liCount>0):
setLayoutState('upload1Row');
var api = $('#UploadList').data('jsp');
api.reinitialise();
break;
case (liCount<=10 && liCount>5):
setLayoutState('upload2Rows');
var api = $('#UploadList').data('jsp');
api.reinitialise();
break;
case (liCount>10):
var api = $('#UploadList').data('jsp');
api.reinitialise();
break;
}
Спасибо за любой совет!
if
s, потому что они правы. Это ужасное приложениеswitch
.var liCount = 2; switch (liCount) { case 0: console.log(0); break; case (liCount<=5 && liCount>0) && liCount: console.log('liCount<=5 && liCount>0'); break; case (liCount<=10 && liCount>5) && liCount: console.log('liCount<=10 && liCount>5'); break; case (liCount>10) && liCount: console.log(liCount); break; }
Ответы:
Это работает:
switch (true) { case liCount == 0: setLayoutState('start'); var api = $('#UploadList').data('jsp'); api.reinitialise(); break; case liCount<=5 && liCount>0: setLayoutState('upload1Row'); var api = $('#UploadList').data('jsp'); api.reinitialise(); break; case liCount<=10 && liCount>5: setLayoutState('upload2Rows'); var api = $('#UploadList').data('jsp'); api.reinitialise(); break; case liCount>10: var api = $('#UploadList').data('jsp'); api.reinitialise(); break; }
В предыдущей версии этого ответа причиной были круглые скобки. По правде говоря, круглые скобки здесь не имеют значения - единственное, что необходимо, это
switch(true){...}
чтобы ваши выражения case оценивали логические значения.Это работает, потому что значение, которое мы даем переключателю, используется в качестве основы для сравнения. Следовательно, выражения case, также вычисляющие логические значения, будут определять, какой case запускается. Можно также изменить это, передать
switch(false){..}
и получить желаемые выражения, оцениваемые как ложные, а не как истинные ... но лично предпочитаю иметь дело с условиями, которые оцениваются как истинность. Однако он тоже работает, поэтому стоит помнить о том, что он делает.Например: если liCount равно 3, первое сравнение будет
true === (liCount == 0)
, что означает, что первый случай неверен. Затем переключатель переходит к следующему случаюtrue === (liCount<=5 && liCount>0)
. Это выражение принимает значение true, что означает, что этот случай запускается и завершается наbreak
. Я добавил здесь круглые скобки, чтобы было понятнее, но они необязательны, в зависимости от сложности вашего выражения.Это довольно простой и изящный способ (если он соответствует тому, что вы пытаетесь сделать) обработки длинной серии условий, где, возможно, длинная серия
ìf() ... else if() ... else if () ...
может внести много визуального шума или хрупкости.Используйте с осторожностью, потому что это нестандартный шаблон, несмотря на то, что это действительный код.
источник
switch(true) {
,case liCount == 0:
да? Иначе это сравнение естьliCount == (liCount <=5 && liCount > 0)
.switch(false) {
}Ты путь усложненной что. Напишите это с операторами if вместо этого:
if(liCount == 0) setLayoutState('start'); else if(liCount<=5) setLayoutState('upload1Row'); else if(liCount<=10) setLayoutState('upload2Rows'); $('#UploadList').data('jsp').reinitialise();
Или, если ChaosPandion пытается максимально оптимизировать:
setLayoutState(liCount == 0 ? 'start' : liCount <= 5 ? 'upload1Row' : liCount <= 10 ? 'upload2Rows' : null); $('#UploadList').data('jsp').reinitialise();
источник
setLayoutState
: P.Вы хотите использовать операторы if:
if (liCount === 0) { setLayoutState('start'); } else if (liCount <= 5) { setLayoutState('upload1Row'); } else if (liCount <= 10) { setLayoutState('upload2Rows'); } $('#UploadList').data('jsp').reinitialise();
источник
См . Ответ dmp ниже. Я бы удалил этот ответ, если бы мог, но он был принят, так что это следующий лучший вариант :)
Вы не можете. Интерпретаторы JS требуют от вас сравнения с оператором switch (например, нет оператора case when). Если вы действительно хотите это сделать, вы можете просто делатьif(){ .. } else if(){ .. }
блоки.источник
liCount
. Я просто указал на то, что исходное утверждение cwolves о том, что «интерпретаторы JS требуют, чтобы операторы case были статическими значениями», было неверным. cwolves с тех пор изменил это утверждение, поэтому мой комментарий больше не актуален.true
и это сработает . Но ему больше трех лет, так что мне все равно.switch (true) { case condition0: ... break; case condition1: ... break; }
будет работать в JavaScript, пока ваши условия возвращают правильные
boolean
значения, но у него нет особых преимуществ передelse if
операторами.источник
10
в операторе switch? в моем случае не работает, не знаю, в чем причина.10 !== true
, так что нет. Есть ли какая-нибудь переменная, которая может иметь значение10
? Еслиx
, тоcase x === 10:
сработает.if (10) {..}
поток, он должен проходить вIf
условии, не так ли? потому что 10 или любое целое число, кроме 0, будет рассматриваться как истинное значение и позволит войти в условие. Не уверен, что не так с его оператором переключения здесь.switch
просто не работаетif
.if
проверяет, является ли условие истинным .switch
проверяет , является ли выражение после того ,switch
является===
( CaseClauseIsSelected шаг 4 ) к значению выражения послеcase
.Это тот случай, когда вам следует использовать
if
предложения.источник
Если это то, что вы хотите сделать, лучше использовать
if
операторы. Например:if(liCount == 0){ setLayoutState('start'); } if(liCount<=5 && liCount>0){ setLayoutState('upload1Row'); } if(liCount<=10 && liCount>5){ setLayoutState('upload2Rows'); } var api = $('#UploadList').data('jsp'); api.reinitialise();
источник
Ваш код не работает, потому что он не выполняет то, что вы от него ожидаете. Блоки переключателей принимают значение и сравнивают каждый случай с заданным значением в поисках равенства. Значение для сравнения - целое число, но большинство выражений case преобразуются в логическое значение.
Так, например, скажем
liCount = 2
. Ваш первый случай не подходит, потому что2 != 0
. Ваш второй случай(liCount<=5 && liCount>0)
оценивается какtrue
, но2 != true
, поэтому и этот случай не будет соответствовать.По этой причине, как говорили многие другие, для этого вам следует использовать серию
if...then...else if
блоков.источник
если возможные значения являются целыми числами, вы можете группировать случаи. В противном случае используйте ifs.
var api, tem; switch(liCount){ case 0: tem= 'start'; break; case 1: case 2: case 3: case 4: case 5: tem= 'upload1Row'; break; case 6: case 7: case 8: case 9: case 10: tem= 'upload2Rows'; break; default: break; } if(tem) setLayoutState((tem); api= $('#UploadList').data('jsp'); api.reinitialise();
источник
Обратите внимание, что мы не передаем счет переключателю, но это правда. Значение, которое мы даем переключателю, используется в качестве основы для сравнения.
В приведенном ниже примере показано, как мы можем добавлять условия в случае: без каких-либо операторов if.
function getGrade(score) { let grade; // Write your code here switch(true) { case score >= 0 && score <= 5: grade = 'F'; break; case score > 5 && score <= 10: grade = 'E'; break; case score > 10 && score <= 15: grade = 'D'; break; case score > 15 && score <= 20: grade = 'C'; break; case score > 20 && score <= 25: grade = 'B'; break; case score > 25 && score <= 30: grade = 'A'; break; } return grade; }
источник
Хотя в конкретном примере вопроса OP
switch
это не подходит, есть пример, где переключатель все еще уместен / полезен, но также требуются другие выражения оценки. Этого можно добиться, используя для выражений предложение по умолчанию:switch (foo) { case 'bar': // do something break; case 'foo': // do something break; ... // other plain comparison cases default: if (foo.length > 16) { // something specific } else if (foo.length < 2) { // maybe error } else { // default action for everything else } }
источник