JavaScript: использование условия в случае переключения - PullRequest
60 голосов
/ 28 марта 2011

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

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

Ответы [ 9 ]

212 голосов
/ 29 января 2012

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

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, также вычисляющие логические значения, будут определять, какой регистр запускается.Можно также перевернуть это, передать switch(false){..} и получить желаемое выражение, оцениваемое как ложное, а не истинное ... но лично предпочитающее иметь дело с условиями, которые оценивают как истинность.Тем не менее, это тоже работает, поэтому стоит иметь в виду, чтобы понять, что он делает.

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

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

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

19 голосов
/ 29 марта 2011

Вы способ это слишком усложнили.Вместо этого напишите оператор 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();
7 голосов
/ 29 марта 2011

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

if (liCount === 0) {
    setLayoutState('start');
} else if (liCount <= 5) {
    setLayoutState('upload1Row');
} else if (liCount <= 10) {
    setLayoutState('upload2Rows');
}
$('#UploadList').data('jsp').reinitialise();  
7 голосов
/ 29 марта 2011

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

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

4 голосов
/ 29 января 2012
switch (true) {
  case condition0:
    ...
    break;
  case condition1:
    ...
    break;
}

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

4 голосов
/ 29 марта 2011

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

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

2 голосов
/ 29 марта 2011

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

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

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

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

...