javascript:在switch case中使用条件

hae*_*mse 69 javascript select-case conditional-statements

对不起那个愚蠢的问题.如何在javascript switch-case语言元素中使用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;                  
}
Run Code Online (Sandbox Code Playgroud)

谢谢你的建议!

dmp*_*dmp 225

这有效:

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;                  
}
Run Code Online (Sandbox Code Playgroud)

此答案的先前版本认为括号是罪魁祸首.事实上,括号在这里是无关紧要的 - 唯一必要的是switch(true){...}你的案例表达式来评估布尔值.

它的工作原理是,我们给开关的值用作比较的基础.因此,案例表达式,也评估布尔值将决定运行哪种情况.也可以转过来,并传递switch(false){..}并将所需的表达式评估为false而不是true ..但个人更喜欢处理评估为真实性的条件.但是,它确实也有效,因此值得记住,了解它在做什么.

例如:如果liCount为3,则第一个比较是true === (liCount == 0),意味着第一种情况是假的.然后开关转到下一个案例true === (liCount<=5 && liCount>0).此表达式的计算结果为true,表示此情况已运行,并终止于break.我在这里添加括号以使其更清晰,但它们是可选的,具体取决于表达式的复杂性.

它非常简单,并且处理一系列条件很简单(如果它符合你想要做的),也许很长一段时间ìf() ... else if() ... else if () ...可能会引入很多视觉噪音或脆弱性.

请谨慎使用,因为它是非标准模式,尽管是有效的代码.

  • 你知道,这不是因为你_can_你_should_.这是需要用火杀死的东西. (23认同)
  • 它是语言的一部分 - 因此,了解它总比不上.显然,它并不适合所有情况,但在纯粹的主观层面上,我认为这是一种有趣的方法,在这种情况下比一系列ifs/elif更易读/更脆弱.重要的是要记住,编码是意图的表达,加上品味和实践.有更多选择在代码中清楚地表达自己从来都不是坏事. (14认同)
  • 我想你需要`switch(true){`和`case liCount == 0:`对吗?否则这个比较是`liCount ==(liCount <= 5 && liCount> 0)`. (6认同)
  • 对我来说,这是非常有用的,也是一种非常好的组织逻辑的方式,我需要根据 if 条件一遍又一遍地使用变量名,但这是一个 n+1 类型的场景,因此 switch 语句 case 没有中断将移至下面的下一行,这非常有用。 (2认同)
  • 您甚至让我们睁开眼睛看看如果 switch 表达式为 false 会出现什么结果,就像 `switch(false) { `} (2认同)

Eri*_*ric 19

的方式过于复杂这一点.用if语句写它,就像这样:

if(liCount == 0)
    setLayoutState('start');
else if(liCount<=5)
    setLayoutState('upload1Row');
else if(liCount<=10)
    setLayoutState('upload2Rows');

$('#UploadList').data('jsp').reinitialise();
Run Code Online (Sandbox Code Playgroud)

或者,如果ChaosPandion尝试尽可能地优化:

setLayoutState(liCount == 0 ? 'start' :
               liCount <= 5 ? 'upload1Row' :
               liCount <= 10 ? 'upload2Rows' :
               null);

$('#UploadList').data('jsp').reinitialise();
Run Code Online (Sandbox Code Playgroud)


小智 9

您可以在 switch case 中使用 drop-through 方法。

const x = 'Welcome';

switch (x) {
  case 'Come':
    console.log(1)
    break;

  case 'Welcome':
  case 'Wel':
  case 'come':
    console.log(2)
    break;

  case 'Wel':
    console.log(3)
    break;

  default:
    break;
}

    
> Result => 2
Run Code Online (Sandbox Code Playgroud)


Mar*_*ahn 7

请参阅下面的dmp答案.如果可以的话,我会删除这个答案,但它已被接受,所以这是下一个最好的东西:)

你不能.JS解释器要求您与switch语句进行比较(例如,没有"case when when"语句).如果你真的想这样做,你可以制作if(){ .. } else if(){ .. }积木.

  • 那是不对的.这是一个显示它工作的演示:http://jsfiddle.net/Ender/fr3wL/.ECMAScript标准明确声明允许这样做:http://docstore.mik.ua/orelly/webprog/jscript/ch06_05.htm#FOOTNOTE-18 (9认同)
  • @Ender和haemse试图做的一样怎么样? (3认同)

Cha*_*ion 7

您想使用if语句:

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


ken*_*bec 5

如果可能的值是整数,则可以将情况集中起来。否则,使用 if。

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();
Run Code Online (Sandbox Code Playgroud)


Mik*_*uel 5

switch (true) {
  case condition0:
    ...
    break;
  case condition1:
    ...
    break;
}
Run Code Online (Sandbox Code Playgroud)

只要您的条件返回正确的boolean值,它就可以在JavaScript中工作,但是与else if语句相比并没有很多优势。