在JavaScript中切换语句多个案例

Afs*_*ani 692 javascript switch-statement

我在JavaScript中的switch语句中需要多个case,比如:

switch (varName)
{
   case "afshin", "saeed", "larry": 
       alert('Hey');
       break;

   default: 
       alert('Default case');
       break;
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?如果在JavaScript中没有办法做类似的事情,我想知道一个也遵循DRY概念的替代解决方案.

ken*_*ytm 1370

使用switch语句的fall-through功能.匹配的大小写将一直运行,直到找到break(或switch语句的结尾),因此您可以将其写为:

switch (varName)
{
   case "afshin":
   case "saeed":
   case "larry": 
       alert('Hey');
       break;

   default: 
       alert('Default case');
}
Run Code Online (Sandbox Code Playgroud)

  • 请参阅:https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Statements/switch (9认同)
  • @nafg:试试`switch(1)`.这里的标签只是一个逗号表达式. (8认同)
  • 不知何故,它适用于Chrome,在javascript控制台中:`switch('10'){case 1,'10':console.log('ok')}`打印`ok` (2认同)
  • @Barney不,没有休息,你可以接受下一个案例. (2认同)

小智 87

这适用于常规JavaScript

function theTest(val) {
  var answer = "";
  switch( val ) {
    case 1: case 2: case 3:
      answer = "Low";
      break;
    case 4: case 5: case 6:
      answer = "Mid";
      break;
    case 7: case 8: case 9:
      answer = "High";
      break;
    default:
      answer = "Massive or Tiny?";
  } 
  return answer;  
}

theTest(9);
Run Code Online (Sandbox Code Playgroud)

干杯.

  • @believesInSanta实际上是正常情况下的异常,格式很奇怪(用空格代替换行符) (6认同)
  • 您还可以使用 case (1||2||3): 代替 case 1: case 2: case 3: (3认同)
  • @KasunHasanga 建议的解决方案不起作用的原因是因为 `case (1||2||3):` 相当于 `case 1:` (因为 `1||2||3` 的计算结果为 `1` )。 (3认同)
  • 案例 1: 案例 2: 案例 3: 对我有用,谢谢,但@kasun 你的解决方案不起作用。 (2认同)
  • 仅供参考,我在 TS 中尝试了 @Kasun 的方法,但它对我不起作用(我知道 OP 想要 JS 中的解决方案) (2认同)

elc*_*nrs 42

这是switch完全避免声明的不同方法:

var cases = {
  afshin: function() { alert('hey'); },
  _default: function() { alert('default'); }
};
cases.larry = cases.saeed = cases.afshin;

cases[ varName ] ? cases[ varName ]() : cases._default();
Run Code Online (Sandbox Code Playgroud)

  • 一个人总是可以抓住左耳从右手穿过脖子后面...(对不起我的英语,我的意思是:"一个人总是可以让事情变得复杂......在这种情况下,避免切换声明赞成这个复杂的解决方案似乎不是正确的做...) (38认同)
  • 每当我故意省略`break`时,我总是添加一个注释`// fallthrough`代替`break`.这有助于确定什么时候出错,什么时候出故障. (27认同)
  • 我真的很惊讶这是如何获得34票.在可读性和可维护性方面,这绝对是可怕的.如果我想看看会触发什么条件,通过查看标签,案例陈述非常简单易行.另一方面,你的版本需要有人阅读几乎每一行,看看你分配到哪里.您想要匹配的案例越多,情况就越糟糕. (24认同)
  • 直观的方法.但是,为了便于阅读,我建议使用本机switch语句. (18认同)
  • 我绝对更喜欢这个版本.堕落是一个容易出错的"切换...案例"功能.忘记一个"break"语句太容易了,如果你故意使用掉落,那些被遗忘的"break"语句很难被发现.此方法查找版本还具有许多"切换...大小写"缺少的强大功能,例如动态可扩展性,或完全替换对象以完成模式切换的能力.保持整洁有序也更容易,并且可以导致更易于维护的代码.见http://ericleads.com/2012/12/switch-case-considered-harmful/ (5认同)
  • 如果您这样做的唯一原因是因为您有一个恐惧症来切换语句,这很可怕.如果我不得不读这篇文章只是为了弄清楚它和开关是一样的,我会很生气.吻 (3认同)
  • 不,在我的书中,`switch`是反模式.这一点并不复杂,相反,它是一种常见的替代方案,显然对于可维护性和重构更好,因为您现在可以移动案例,因为您有表达式而不是语句. (2认同)
  • 这是一个可怕的功能。初级开发人员应该如何快速查看并理解它?是的,switch 语句占用更多空间,但更易于调试和维护。 (2认同)

小智 17

在Js中为switch分配多个case我们必须定义different case without break inbetween如下所示:

   <script>
      function checkHere(varName){
        switch (varName)
           {
           case "saeed":
           case "larry":
           case "afshin":
                alert('Hey');
                break;
          case "ss":
               alert('ss');
               break;
         default:
               alert('Default case');
               break;
       }
      }
     </script>
Run Code Online (Sandbox Code Playgroud)

请参阅示例单击链接

  • 这是一种常见的语言技术,不受JS的限制 (5认同)

小智 15

我喜欢这样的清晰度和DRY语法。

varName = "larry";

switch (true)
{
    case ["afshin", "saeed", "larry"].includes(varName) :
       alert('Hey');
       break;

    default:
       alert('Default case');

}
Run Code Online (Sandbox Code Playgroud)


Eri*_*ikE 12

如果您使用的是ES6,则可以执行以下操作:

if (['afshin', 'saeed', 'larry'].includes(varName)) {
   alert('Hey');
} else {
   alert('Default case');
}
Run Code Online (Sandbox Code Playgroud)

或者对于早期版本的JavaScript,您可以这样做:

if (['afshin', 'saeed', 'larry'].indexOf(varName) !== -1) {
   alert('Hey');
} else {
   alert('Default case');
}
Run Code Online (Sandbox Code Playgroud)

请注意,这在旧的IE浏览器中不起作用,但您可以相当容易地修补.请参阅问题确定字符串是否在javascript列表中以获取更多信息.

  • @BryceSnyder 表达式和语句之间的区别?打字少了?消耗的垂直线更少?通过简洁和密集的表达来增强表达能力?通过“包含”一词获得更好的语义?随你挑选。 (3认同)
  • 对我来说的好处是,我可以使用外部配置源中的数组,并且在外部更改数组后,代码仍然有效。 (3认同)

Mik*_*e K 12

我的情况类似于:

switch (text) {
  case SOME_CONSTANT || ANOTHER_CONSTANT:
    console.log('Case 1 entered');

  break;

  case THIRD_CONSTANT || FINAL_CONSTANT:
    console.log('Case 2 entered');

  break;

  default:
    console.log('Default entered');
}
Run Code Online (Sandbox Code Playgroud)

default情况下,始终输入。如果您遇到类似的多案例 switch 语句问题,您正在寻找这个:

switch (text) {
  case SOME_CONSTANT:
  case ANOTHER_CONSTANT:
    console.log('Case 1 entered');

  break;

  case THIRD_CONSTANT:
  case FINAL_CONSTANT:
    console.log('Case 2 entered');

  break;

  default:
    console.log('Default entered');
}
Run Code Online (Sandbox Code Playgroud)


Aut*_*ico 8

在 Node.js 中,您似乎可以这样做:

data = "10";
switch(data){
    case "1": case "2": case "3": // Put multiple cases on the same
                                  // line to save vertical space.
        console.log("small");
        break;

    case "10": case "11": case "12":
        console.log("large");
        break;

    default:
        console.log("strange");
        break;
}
Run Code Online (Sandbox Code Playgroud)

在某些情况下,这使得代码更加紧凑。

  • 我认为语法与其他 JS 环境相同。 (2认同)

小智 7

这是一种更易于使用的 switch case 语句。这可以满足您的要求。我们可以使用 switch 语句中的 find 方法来获取所需的输出。

    switch(varname){
    case["afshin","saeed","larry"].find(name => name === varname):
        alert("Hey")
        break;
    default:
        alert('Default case');
        break;
}
Run Code Online (Sandbox Code Playgroud)


Z. *_*lah 6

添加和澄清Stefano的答案,您可以使用表达式以dinamically方式设置switch中条件的值,例如:

var i = 3
switch (i) {
    case ((i>=0 && i<=5)?i:-1): console.log('0-5'); break;
    case 6: console.log('6');
}
Run Code Online (Sandbox Code Playgroud)

所以在你的问题中,你可以这样做:

var varName = "afshin"
switch (varName) {
    case (["afshin", "saeed", "larry"].indexOf(varName)+1 && varName):
      console.log("hey");
      break;

    default:
      console.log('Default case');
}
Run Code Online (Sandbox Code Playgroud)

虽然不是那么干......


Ser*_*kov 6

我像这样使用它:

switch (true){
     case /Pressure/.test(sensor): 
     {
        console.log('Its pressure!');
        break;
     }

     case /Temperature/.test(sensor): 
     {
        console.log('Its temperature!');
        break;
     }
}
Run Code Online (Sandbox Code Playgroud)


ZEE*_*ZEE 5

你可以使用' in '运算符...
依赖于对象/哈希调用...
所以它和javascript一样快......

// assuming you have defined functions f(), g(a) and h(a,b) 
// somewhere in your code
// you can define them inside the object but... 
// the code becomes hard to read, I prefer this way

o = { f1:f, f2:g, f3:h };

// if you use "STATIC" code can do:
o['f3']( p1, p2 )

// if your code is someway "DYNAMIC", to prevent false invocations
// m brings the function/method to be invoked (f1, f2, f3)
// and you can rely on arguments[] to solve any parameter problems
if ( m in o ) o[m]()
Run Code Online (Sandbox Code Playgroud)

享受,ZEE


Sco*_*Dea 5

一些有趣的方法。对我来说,解决问题的最佳方法是使用.find.

您可以通过在查找函数中使用合适的名称来指示多种情况。

switch (varName)
{
   case ["afshin", "saeed", "larry"].find(firstName => firstName === varName):
       alert('Hey');
       break;

   default:
       alert('Default case');
       break;
}
Run Code Online (Sandbox Code Playgroud)

其他答案更适合给定的示例,但如果您有多种情况,这是最好的方法。