Javascript 如何在switch语句中的某些情况下执行多个代码块?

Javascript 如何在switch语句中的某些情况下执行多个代码块?,javascript,switch-statement,code-structure,Javascript,Switch Statement,Code Structure,我有这样一个switch语句: switch(a) { case 0: // do something break; case 1: // do something else break; } switch(a) { case 0: case 2: // do something break; case 1: case 2: //

我有这样一个switch语句:

switch(a) {
    case 0: 
        // do something
        break;
    case 1:
        // do something else
        break;
}
switch(a) {
    case 0: 
    case 2:
        // do something
        break;
    case 1:
    case 2:
        // do something else
        break;
}
switch(a) {
  case 0: 
    caseHandler([0]);
    break;
  case 1:
    caseHandler([1]);
    break;
  case 2:
    caseHandler([0,1]);
    break;
}
例如,当
a==2
时,我想执行两个代码块。我想这样写:

switch(a) {
    case 0: 
        // do something
        break;
    case 1:
        // do something else
        break;
}
switch(a) {
    case 0: 
    case 2:
        // do something
        break;
    case 1:
    case 2:
        // do something else
        break;
}
switch(a) {
  case 0: 
    caseHandler([0]);
    break;
  case 1:
    caseHandler([1]);
    break;
  case 2:
    caseHandler([0,1]);
    break;
}
但显然,这不起作用,因为first break语句结束了整个switch语句

我唯一能想到的方法就是编写助手函数:

function case0() {
    // do something
}

function case1() {
    // do something else
}

switch(a) {
    case 0: 
        case0();
        break;
    case 1:
        case1();
        break;
    case 2:
        case0();
        case1();
        break;
}

这个解决方案对我来说似乎有点冗长和丑陋。有更好的方法来实现我想要的吗?

开关
语句中,从第一个真条件到最近的
中断
执行代码。因此,在您的情况下,以下构造可能会起作用

var a = 2;//1;//0;//-1;
switch(a){
  case 2: //and also one and zero
    console.log('two');
  case 1: //and also zero
    console.log('one');
  case 0: //zero only
    console.log('zero');
    break;
  default: //no matches
    console.log('default');
}

开关
语句中,从第一个真条件到最近的
中断
执行代码。因此,在您的情况下,以下构造可能会起作用

var a = 2;//1;//0;//-1;
switch(a){
  case 2: //and also one and zero
    console.log('two');
  case 1: //and also zero
    console.log('one');
  case 0: //zero only
    console.log('zero');
    break;
  default: //no matches
    console.log('default');
}
你问是否有更好的方法来实现你的目标

好吧,我的解决方案是否合格取决于您对“更好”的定义,但无论如何,这里是:

您可以将switch语句如下所示:

switch(a) {
    case 0: 
        // do something
        break;
    case 1:
        // do something else
        break;
}
switch(a) {
    case 0: 
    case 2:
        // do something
        break;
    case 1:
    case 2:
        // do something else
        break;
}
switch(a) {
  case 0: 
    caseHandler([0]);
    break;
  case 1:
    caseHandler([1]);
    break;
  case 2:
    caseHandler([0,1]);
    break;
}
并将值数组传递给使用另一个开关的单个辅助函数:

function caseHandler(values) {
  for (var i = 0; i < values.length; i++) {
    switch (values[i]) {
      case 0:
        console.log('doing zero stuff');
        break;
      case 1:
        console.log('doing one stuff');
        break;
    }
  }
}
函数caseHandler(值){
对于(变量i=0;i
你问是否有更好的方法来实现你想要的

好吧,我的解决方案是否合格取决于您对“更好”的定义,但无论如何,这里是:

您可以将switch语句如下所示:

switch(a) {
    case 0: 
        // do something
        break;
    case 1:
        // do something else
        break;
}
switch(a) {
    case 0: 
    case 2:
        // do something
        break;
    case 1:
    case 2:
        // do something else
        break;
}
switch(a) {
  case 0: 
    caseHandler([0]);
    break;
  case 1:
    caseHandler([1]);
    break;
  case 2:
    caseHandler([0,1]);
    break;
}
并将值数组传递给使用另一个开关的单个辅助函数:

function caseHandler(values) {
  for (var i = 0; i < values.length; i++) {
    switch (values[i]) {
      case 0:
        console.log('doing zero stuff');
        break;
      case 1:
        console.log('doing one stuff');
        break;
    }
  }
}
函数caseHandler(值){
对于(变量i=0;i
开关
语句非常复杂。你所建议的是改变他们在基本层面上的工作方式。为什么不使用一个可以链接到函数的映射表呢<代码>{2:function(){…}}
例如,我想将它保存在
switch
中的主要原因是我已经在
switch
语句上构建了我的项目,我不想为了能够完成我描述的任务而将其全部重写为其他内容。你想要的和JavaScript可以做的是两件不同的事情。你想屈从于现实,还是想毕生与现实抗争?如果你愿意,欢迎你来。有时候,我们认为最好的方法并没有成功。学习、适应、前进。
switch
语句足够复杂。你所建议的是改变他们在基本层面上的工作方式。为什么不使用一个可以链接到函数的映射表呢<代码>{2:function(){…}}例如,我想将它保存在
switch
中的主要原因是我已经在
switch
语句上构建了我的项目,我不想为了能够完成我描述的任务而将其全部重写为其他内容。你想要的和JavaScript可以做的是两件不同的事情。你想屈从于现实,还是想毕生与现实抗争?如果你愿意,欢迎你来。有时候,我们认为最好的方法并没有成功。学习,适应,继续。这种类型的执行被称为通过执行下降,这意味着——正如我所理解和你所说的——在没有中断语句的情况下,开关将找到第一个真实的条件,并在下降过程中通过开关的关闭括号执行每一个案例。这种类型的执行存在于C语言、C++、java、JavaScript中,还有一些其他人肯定。VB.net是一种不符合普遍共识的语言。尽管这个答案非常接近于解决问题,它仍然不允许案例1独立执行。这种类型的执行被称为fall through execution,意思是——正如我所理解和您所说的那样——在没有中断语句的情况下,开关将找到第一个真实条件,并在向下执行每一个案例的过程中通过开关的关闭括号。这种类型的执行存在于C语言、C++、java、JavaScript中,还有一些其他人肯定。VB.net是一种不符合普遍共识的语言。虽然这个答案非常接近于解决问题,但它仍然不允许案例1独立执行。