Это работает:
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 () ...
может внести много визуального шума или хрупкости.
Используйте с осторожностью, потому что это нестандартный шаблон, несмотря на то, что это действительный код.