JavaScript: 在 switch 情况下使用条件

如何使用 JavaScript 的 switch 语句中的条件? In the example below, a case should match when the variable liCount is <= 5 and > 0; however, my code does not work:

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;
default:
break;
}

感谢你的建议!

264669 次浏览

在这种情况下,应该使用 if子句。

见下面的 DMP 的回答。如果可以,我想删除这个答案,但它被接受了,所以这是第二好的事情:)

你不能。JS 解释器要求您与 switch 语句进行比较(例如,没有“ case when”语句)。如果你真的想这样做,你可以只使 if(){ .. } else 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();

您想使用 if 语句:

if (liCount === 0) {
setLayoutState('start');
} else if (liCount <= 5) {
setLayoutState('upload1Row');
} else if (liCount <= 10) {
setLayoutState('upload2Rows');
}
$('#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();

或者,如果 混沌潘迪恩试图尽可能地优化:

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


$('#UploadList').data('jsp').reinitialise();

您的代码无法工作,因为它没有完成您所期望的任务。开关块接受一个值,并将每种情况与给定的值进行比较,以寻找相等性。您的比较值是一个整数,但是大多数 case 表达式解析为一个布尔值。

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

出于这个原因,正如许多其他人所说的,您应该使用一系列 if...then...else if块来完成这项工作。

if the possible values are integers you can bunch up cases. Otherwise, use 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 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){..},使所需的表达式的计算结果为 false 而不是 true。.但个人更喜欢处理评估为真实的情况。然而,它也确实有效,所以值得记住,以理解它在做什么。

如果 liCount 为3,则第一个比较是 true === (liCount == 0),表示第一个情况为 false。然后开关移动到下一种情况下 true === (liCount<=5 && liCount>0)。这个表达式的计算结果为 true,表示运行这个 case,并在 break处终止。我在这里添加了括号以使其更清晰,但它们是可选的,这取决于表达式的复杂性。

它非常简单,而且是一种处理一系列条件的简洁方法(如果它符合您正在尝试做的事情的话) ,在这些条件下,可能一个长的 ìf() ... else if() ... else if () ...系列会引入大量的视觉噪声或脆弱性。

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

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

will work in JavaScript as long as your conditions return proper boolean values, but it doesn't have many advantages over else if statements.

注意,我们并没有将得分传递给开关,而是传递给 true。我们给开关的值用作比较的基础。

下面的例子展示了如何在这种情况下添加条件: 不使用任何 if 语句。

function getGrade(score) {
let grade;
// Write your code here
switch(true) {
case score >= 0 && score <= 5:
grade = 'F';
break;
case score > 5 && score <= 10:
grade = 'E';
break;
case score > 10 && score <= 15:
grade = 'D';
break;
case score > 15 && score <= 20:
grade = 'C';
break;
case score > 20 && score <= 25:
grade = 'B';
break;
case score > 25 && score <= 30:
grade = 'A';
break;
}


return grade;
}

尽管在 OP 问题的特定例子中,switch是不合适的,但是有一个例子中,switch 仍然是合适的/有益的,但是还需要其他的求值表达式。这可以通过在表达式中使用默认子句来实现:

switch (foo) {
case 'bar':
// do something
break;
case 'foo':
// do something
break;
... // other plain comparison cases
default:
if (foo.length > 16) {
// something specific
} else if (foo.length < 2) {
// maybe error
} else {
// default action for everything else
}
}

您可以在开关情况下使用秋季通过方法。

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

If you want pass any value in switch statement 然后对传递的值应用条件 计算语句然后你必须写开关 statement under an function and pass parameter in that 函数,然后在开关表达式中传递 true,如 below example.

function numberChecker(num){
let age;
switch(true){
case num >= 0 && num <= 10:
age = "Child";
break;
      

case num >= 10 && num <= 20:
age = "Teenager";
break;
      

case num >= 20 && num <= 30:
age = "Young";
break;


default:
age = "Undefined!! Enter Age Between 0 - 30";
break;
      

}
  

console.log("WOW You Are " + age);
}
numberChecker(15);