【问题标题】:How to shorten a long if else statement [closed]如何缩短长 if else 语句[关闭]
【发布时间】:2013-12-17 01:33:44
【问题描述】:

我正在尝试弄清楚如何简化可能的长 if else 语句。

有 8 种可能性可供选择,对于每个选项 1-8,我想显示一条消息。

例如,这是可行的,但我知道可以写得更好:

if(this.cv == '1'){ 
 console.log('Greater Then 1');
} else
if(this.cv == '2'){
 console.log('Greater Than 2');
}

等等...

寻找更有活力的东西。

【问题讨论】:

  • 这个问题似乎跑题了,因为它是关于代码审查的 - codereview.stackexchange.com
  • 如果只需要一对一查找,不需要切换,比LUT慢:console.log({1:'gt one', 2:'gt two'}[ this.cv])

标签: javascript if-statement


【解决方案1】:

使用地图:

var messages = {
    '1' : 'Greater than 1',
    '2' : 'Greater than 2',
   ....etc
}

console.log(messages[this.cv]);

【讨论】:

  • 我自己说得再好不过了,虽然我试过了......为什么在一个开关中运行许多比较,而你可以运行一个名称解析呢?
  • @dandavis 在内部,这几乎与 switch 所做的一样,但使用的是语句块而不是字符串。
  • switch 评估每种情况,例如:switch(true),对象不评估。如有疑问,请替补。
  • 谢谢,这真的很有帮助!
  • @TikaL13 - 没问题,乐于助人!
【解决方案2】:

如果这是您的消息的确切格式(适用于所有情况),那么您可以简单地写:

console.log('Greater Than ' + this.cv);

但是,如果您在每种情况下都需要更大的灵活性,那么您可以按照其他答案的建议使用 switch 语句。

【讨论】:

    【解决方案3】:

    使用 switch 语句:

    switch(this.cv)
    {
    case '1':
      console.log('Greater Than 1');
      break;
    case '2':
      console.log('Greater Than 2');
      break;
    default:
      //executed if no matches are found
    }
    

    或者根据 adeneo 的回答,地图也可以正常工作,因为这基本上就是 switch 语句的实现方式。两者都是压缩多个 if 语句的好选择。

    【讨论】:

      【解决方案4】:

      这就是 switch 声明的目的。

      switch(this.cv) {
      case '1':
          console.log("Greater than 1");
          break;
      case '2':
          console.log("Greater than 2");
          break;
      }
      

      您甚至可以添加“包罗万象”的默认操作:

      default:
          console.log("I don't know what to do with "+this.cv);
      

      【讨论】:

        【解决方案5】:
        switch(n)
        {
        case '1':
          execute code block 1
          break;
        case '2':
          execute code block 2
          break;
        default:
          code to be executed if n is different from case 1 and 2
        }
        

        【讨论】:

          【解决方案6】:

          你可以使用switch语句,查看这个链接for more details

          SWITCH 的一般语法:

          switch (expression) {
            case label1:
              statements1
              [break;]
            case label2:
              statements2
              [break;]
            ...
            case labelN:
              statementsN
              [break;]
            default:
              statements_def
              [break;]
          }
          

          在你的情况下:

          switch(this.cv) {
          case '1':
              console.log("Greater than 1");
              break;
          case '2':
              console.log("Greater than 2");
              break;
          }
          

          【讨论】:

          • 这不会比一系列 if 语句短得多。
          • @j08691 虽然写的代码可能不是,但执行的操作肯定是;)
          • 不过,我不得不否决这个答案,因为你把它复杂化了。 [break;]...虽然我理解它的意思是“可选的break;”,但其他人可能不会。
          • 你应该和 mozilla 谈谈,因为我只是复制了语法:) developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
          【解决方案7】:

          我会说创建一个将可能的值映射到消息的对象,然后简单地从映射中检索消息,如下所示:

          var messages = {'1': 'Greater Then 1',
                          '2': 'Greater Than 2'};
          console.log(messages[this.cv]);
          

          【讨论】:

          • 小心,您正在尝试使用字符值而不是整数来索引数组...
          • 数组是用字符串索引的,有什么问题?
          • 他们可以...您的编辑也许是更好的做法!
          • 我认为它实际上可以在原始选项中工作,但我同意你的建议使它更清楚它的作用,特别是因为你正在使用字符串值检索它。
          【解决方案8】:

          有时取决于我有很多函数可以添加到各种变量中......

          在这种情况下,我更喜欢使用类似的东西。 我用答案创建了一个对象。然后我检查答案是否存在并执行它。 我更喜欢那个开关

          var a={'2':'greater than 2','1':'greater than 1'}
          console.log(a[this.cv]?a[this.cv]:'')
          

          另一种写法是

           var a={'2':'greater than 2','1':'greater than 1'}
           !a[this.cv]||(console.log(a[this.cv]));
          

          或者如果你只需要做一个简短的检查,我会使用 javascript 速记。

          console.log('Greater then '+(a=this.cv,a==1)?1:(a==2)?2:'whatever');
          

          console.log('Greater then '+(this.cv==1?1:2));
          

          在你的情况下是一个

          console.log('Greater than '+this.cv);
          

          应该够了。

          【讨论】:

            猜你喜欢
            • 2012-04-25
            • 1970-01-01
            • 1970-01-01
            • 2022-06-15
            • 1970-01-01
            • 2017-09-05
            • 2016-10-15
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多