【问题标题】:Switch combining cases string regex and number切换组合案例字符串正则表达式和数字
【发布时间】:2013-08-16 06:58:57
【问题描述】:

有没有办法在单个 Javascript switch 语句中创建多个案例?

在我的代码中,我通过 jQuery 接收字段的值。

是否有可能一种情况检查字符串正则表达式,另一种情况检查相同变量的数量?

我的想法是:

var field = $(this).val();
var msg;
switch (field) 
{
    case field.test('Yes'):

     msg = "FOO\n";
     break;

    case 10: 
     msg = "BAR\n";
     break;
}

虽然我在这里看到了:Switch statement for string matching in JavaScript

在字符串上使用 switch 的方法是向 switch 语句发送一个“真”值。

实现这一目标的最简洁(也是正确!)的方法是什么?

【问题讨论】:

  • 在我看来,if/else 将是最简洁和正确的方法,尤其是在只有两种情况的情况下。如果还有其他情况,则根据需要添加一些else if 分支,或者首先在switch 中包含所有数字情况,然后在default 中进行正则表达式测试。你可以使用switch(true),然后为每个case设置你喜欢的任何条件,我自己确实这样做了,但它只会在出现失败的情况下使代码更短...
  • 目前有三个,但未来可能会更多,我希望代码易于扩展,如果/否则不是这样......

标签: javascript jquery regex switch-statement


【解决方案1】:

好的,在我的代码上方编译两个答案,最优雅的 IMO 是:

var fieldVal = $(this).val();

var msg;

switch (true) 
{
  case /Yes/.test(fieldVal):
      msg = "FOO";
      break;
  case fieldVal > 10 :
      msg = "BAR";
      break;
}

这作为单独的 if 语句工作,因为我们正在评估 case 是否返回 true,但以一种更清晰、更简洁的方式,可以让我们选择在一个 switch 中添加完全不同的测试语句。

它起作用的原因可能是评估的 case 表达式被解释为 true 或 false 值,然后检查 main - 开关(真)

【讨论】:

    【解决方案2】:

    你不能case需要单个值,这与switch表达式相比,但你可以放置多个case来执行相同的代码:

    switch (field) {
        case 'Yes':
        case 'yes':
        case 'YES':
            msg = "FOO\n";
            break;
    
        case 10: 
            msg = "BAR\n";
            break;
    }
    

    但是为了使用 test 作为案例,你可以传递 true 来切换(我在一些开源项目中发现了这个技巧):

    switch (true) {
        case field.test('Yes'):
            msg = "FOO\n";
            break;
        case field == 10: 
            msg = "BAR\n";
            break;
    }
    

    但这和if/else是一样的

    【讨论】:

      【解决方案3】:

      注意:你错误地使用了test(),它是一个正则表达式对象的方法,所以你需要/Yes/.test(field)而不是field.test('Yes')。总之……

      如果你只有两个案例,那么我会使用if/else/else if 结构:

      var field = $(this).val();
      var msg;
      if(/Yes/.test(field)) {
           msg = "FOO\n";
      } else if (field === 10) { 
           msg = "BAR\n";
      }
      

      如果您需要添加其他案例,我只需在末尾添加额外的 if else {} 分支即可。

      如果您有几个特定的​​数字案例,您可以考虑将它们放在 switch 中,正则表达式测试放在最后的 default 中:

      switch (field) {
          case 10: 
              msg = "BAR\n";
              break;
          case 30:
              msg = "whatever\n";
              break;
          case 50:
              msg = "hi\n";
              break;
          default:
              if (/Yes/.test(field)) {
                 msg = "FOO\n";
              else if (/No|N|False|/i.test(field)) {
                 msg = "blah\n";
              }
              break;
      }
      

      你在问题​​中提到的switch (true) 选项实际上只是if/else/else if 的一个更混乱的版本,所以它真的没有意义除非你有一些失败的案例:

      switch(true)
          case /Yes/.test(field):
          case /Y/.text(field):
          case /Whatever/.text(field):
              msg = "FOO\n";
              break;
          case field == 10: 
              msg = "BAR\n";
              break;
      }
      

      ...即使这样,if 与多个条件由|| 连接,可以说与适当的换行符一样整洁,并且将多个正则表达式组合成一个可能会更整洁。

      【讨论】:

      • 澄清一下,我不是在检查字段值是字符串还是数字,而是变量字段的特定数字或字符串。
      • 是的,这不是我的回答中涵盖的场景吗?
      猜你喜欢
      • 2012-11-07
      • 1970-01-01
      • 2014-03-08
      • 1970-01-01
      • 2019-04-17
      • 1970-01-01
      • 2012-04-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多