Javascript js开关中的重复案例

Javascript js开关中的重复案例,javascript,switch-statement,Javascript,Switch Statement,在对问题的回答中,最流行的回答是这样做的最佳方式: switch(variable) { case 0: // operation A; case 1: // operation B; break; } 但如果必须在操作A之前执行操作B呢?在这种情况下,这是可以接受的,还是有更好的解决方案: switch(variable) { case 0: case 1: // operation B;

在对问题的回答中,最流行的回答是这样做的最佳方式:

switch(variable) {
    case 0:
        // operation A;
    case 1:
        // operation B;
        break;
}
但如果必须在操作A之前执行操作B呢?在这种情况下,这是可以接受的,还是有更好的解决方案:

switch(variable) {
    case 0:
    case 1:
        // operation B;
        break;
    case 0:
        // operation A;
        break;
}

中断将迫使您退出开关,在这种情况下,最好像这样加倍操作

switch(variable){
    case 0:
       //operation B
       //Operation A
       break;
    case 1:
       // Operation A
       break;
}
避免过多代码重复的最佳方法是将操作A和B分解为单独的函数,这意味着交换机只需要两行代码,即

switch(variable){
    case 0:
       this.DoOperationB(variables)
       this.DoOperationA(variables)
       break;
    case 1:
       this.DoOperationA(variables)
       break;
}

易于测试和查看它的工作方式与您希望的不一样:

函数doStuff(x){
log(`with${x}:`);
开关(x){
案例0:
案例1:
控制台日志(“操作B”);
打破
案例0:
控制台日志(“操作A”);
打破
}
}
doStuff(0);
多斯塔夫(1)解决方案
为了强制这两种情况执行过程B,我们可以按顺序列出它们,不使用任何
break
语句,然后使用
if
语句,而不是重复的
case
语句,用于执行情况1不需要的操作

switch(variable) {
    case 0:
    case 1:
        // operation B;
        if(variable === 0) //operation A ;
        break;
    
}
或者,如果进程B在任何情况下都在进程a之前,那么嵌套函数将是一个很好的解决方案

process_A=function(){
过程_B();
console.log(“运行操作A”);
//行动A;
}
进程_B=函数(){
控制台日志(“运行操作B”);
//行动B;
}
变量=0;
开关(可变){
案例0:
过程_A();
打破
案例1:
过程_B();
打破

}
那么对于
案例0
你想要B,然后是A,对于
案例1
你想要B?在这种情况下,我会考虑使用两个<代码>开关<代码>块,这取决于其他情况的数量。@ BorisLobanov不会有运行时错误,但是它肯定不是完全好的,它是坏的实践,并且不会有OP的期望行为。这将是首选的答案。我只是想避免重复代码和调用函数,但我想我必须这样做或那样做。谢谢@TaraStahler我明白了,所以你希望案例0运行操作B和操作A,案例1运行操作B?是的,没错。但关键是,案例B需要首先运行哈,是的……这并不优雅,但我担心对于这个特定案例没有优雅的解决方案(if语句是多余的)^^在所有给出的答案中,我个人也会这样做:很清楚,避免代码重复,函数通常是一件很好的事情。这个答案更适合于更一般的情况,我们有两个以上的操作要按特定顺序执行。这是因为开关台的顺序需要根据约束变得更复杂。对于这个简单的例子,我的解决方案会更好,但Rando的解决方案是最佳实践。这可能是最好的方法,我只是试图避免破坏代码(操作并不太大或复杂,无法保证)