javascript:在切换情况下使用条件

对不起,这个愚蠢的问题。 如何在javascript switch-case语言元素中使用一个案例的条件? 就像在下面的例子中,当variablesliCount <= 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; } 

感谢您的任何build议!

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

你不能。 JS解释器要求你比较switch语句(比如没有“case when”语句)。 如果你真的想这样做,你可以使if(){ .. } else if(){ .. }块。

这工作:

 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){...} ,对于你的caseexpression式来计算布尔值。

这是有效的,因为我们给交换机的价值是作为比较的基础。 因此,对布尔值进行评估的案例expression式将决定运行哪个案例。 也可以把这个转过来,并通过switch(false){..}和所需的expression式评估为假而不是真正的..但个人喜欢处理条件,评估真相。 但是,它也可以工作,所以值得记住去理解它在做什么。

例如:如果liCount是3,第一个比较是true === (liCount == 0) ,这意味着第一个情况是错误的。 然后切换到下一个true === (liCount<=5 && liCount>0) 。 该expression式的计算结果为true,意味着这种情况下运行,并终止在break 。 我已经在这里添加括号来使其更清楚,但它们是可选的,取决于expression的复杂性。

这是非常简单的,而且是一个整洁的方式(如果它符合你所要做的)处理一系列长条件,在这里或许是一长串“ ìf() ... else if() ... else if () ...可能会引入很多视觉噪音或脆弱性。

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

你已经完成了复杂的过程。 用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(); 

你想使用if语句:

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

这是你应该使用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(); 

如果可能的值是整数,则可以将案例分组。 否则,使用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(); 
 switch (true) { case condition0: ... break; case condition1: ... break; } 

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

你的代码不工作,因为它没有做你期望的事情。 开关块接受一个值,并将每个情况与给定值进行比较,寻找相等性。 您的比较值是一个整数,但大多数情况expression式parsing为布尔值。

举个例子,说liCount = 2 。 你的第一个案件不匹配,因为2 != 0 。 你的第二种情况(liCount<=5 && liCount>0)计算结果为true ,但是2 != true ,所以这种情况也不会匹配。

因为这个原因,正如许多人所说的,你应该使用一系列if...then...else if blocks来做到这一点。