Подтвердить что ты не робот

Javascript: использование условия в корпусе коммутатора

Извините за этот немой вопрос. Как я могу использовать условие для случая в элементе языка 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;                  
}

Спасибо за любой совет!

4b9b3361

Ответ 1

См. dmp answer ниже. Я бы удалил этот ответ, если бы мог, но он был принят, так что это следующее лучшее:)

Вы не можете. JS-интерпретаторы требуют от вас сравнения с оператором switch (например, нет инструкции "case when" ). Если вы действительно хотите это сделать, вы можете просто сделать блоки if(){ .. } else if(){ .. }.

Ответ 2

Это работает:

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-выражений - booleans.

Это работает, потому что значение, которое мы даем коммутатору, используется в качестве основы для сравнения. Следовательно, выражения case, также вычисляющие boolean, будут определять, какой случай выполняется. Также можно было бы обернуть это и передать switch(false){..}, а нужные выражения будут вычисляться как false, а не true.. но лично предпочитают иметь дело с условиями, которые оценивают правдоподобие. Однако он тоже работает, поэтому стоит помнить, что он делает.

Например: если liCount равно 3, первое сравнение true === (liCount == 0), что означает, что первый случай является ложным. Затем переключатель переходит к следующему случаю true === (liCount<=5 && liCount>0). Это выражение имеет значение true, то есть этот случай запускается и заканчивается на break. Я добавил здесь круглые скобки, чтобы сделать их более ясными, но они являются необязательными, в зависимости от сложности вашего выражения.

Это довольно простой и аккуратный способ (если он соответствует тому, что вы пытаетесь сделать) для обработки длинного ряда условий, где, возможно, длинная серия ìf() ... else if() ... else if () ... может представить много визуального шума или хрупкости.

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

Ответ 3

У вас слишком много сложностей. Запишите его с операторами 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();

Ответ 4

Вы хотите использовать операторы if:

if (liCount === 0) {
    setLayoutState('start');
} else if (liCount <= 5) {
    setLayoutState('upload1Row');
} else if (liCount <= 10) {
    setLayoutState('upload2Rows');
}
$('#UploadList').data('jsp').reinitialise();  

Ответ 5

Это случай, когда вы должны использовать предложения if.

Ответ 6

Если это то, что вы хотите сделать, было бы лучше использовать операторы 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();

Ответ 7

если возможные значения являются целыми числами, вы можете связывать случаи. В противном случае используйте 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();

Ответ 8

switch (true) {
  case condition0:
    ...
    break;
  case condition1:
    ...
    break;
}

будет работать в JavaScript до тех пор, пока ваши условия возвращают правильные значения boolean, но не имеют много преимуществ перед операторами else if.

Ответ 9

Ваш код не работает, потому что он не делает то, что вы ожидаете от него. Блоки переключателей принимают значение и сравнивают каждый случай с заданным значением, ища равенство. Ваше значение сравнения представляет собой целое число, но большинство ваших case-выражений принимают логическое значение.

Итак, скажем, liCount = 2. Ваш первый случай не будет соответствовать, потому что 2 != 0. Второй случай (liCount<=5 && liCount>0) оценивается как true, но 2 != true, поэтому этот случай не будет соответствовать.

По этой причине, как и многие другие, вы должны использовать серию if...then...else if для этого.