【问题标题】:Better method of checking a bunch of conditions检查一堆条件的更好方法
【发布时间】:2013-07-26 12:55:38
【问题描述】:

我是 javascript 的新手,但仍能接受语言的细微差别。

我有一段代码,我必须在其中检查特定变量的一组条件。

if (a=="MAIN_DOMAINNAME" || a=="DOMAIN_SERIAL" || a=="DOMAIN_REFRESH" || a=="DOMAIN_RETRY" || a=="DOMAIN_EXPIRE" || a=="DOMAIN_NEGTTL" || a=="MAIN_NS") {

有没有更好的方法来做这个条件检查,比如:

if a is one of ("DOMAIN_SERIAL", "MAIN_DOMAINNAME", "DOMAIN_REFRESH" ) {?

【问题讨论】:

    标签: javascript


    【解决方案1】:

    假设是比较现代的浏览器,可以使用Array.indexOf(spec)

    if (["DOMAIN_SERIAL", "MAIN_DOMAINNAME", "DOMAIN_REFRESH"].indexOf(a) !== -1)
    

    注意 - 您可以轻松地为旧版浏览器填充它(有关操作方法,请参阅 the mdn link)。

    【讨论】:

    • 一分钟内有 8 人支持这样一个微不足道的答案 O_o(并且没有人在这个问题上)。
    • @RobW 我能说什么?与更复杂和具体的问题相比,更简单的问题可以帮助更多的 SO 用户。如果它让您感觉好些,我有一些长达 5 页的答案,并引用了多篇最近文章中的新概念 - 我想没有多少人发现像 this 这样的东西有帮助。
    【解决方案2】:

    正则表达式会更短,并且适用于任何地方:

    if ( /^(MAIN_DOMAINNAME|DOMAIN_SERIAL|DOMAIN_REFRESH|..)$/.test(a) ) {
       // do stuff
    }
    

    FIDDLE

    【讨论】:

    • 这不是等价的。不要忘记 ^ 和 $。
    【解决方案3】:
    var ars = ["DOMAIN_SERIAL", "MAIN_DOMAINNAME", "DOMAIN_REFRESH"];
    if(ars.some(function(ar){ return a === ar; })){
         // do smth
    }
    

    【讨论】:

      【解决方案4】:

      应该提到 switch 语句,因为它应该与问题中给出的示例一起正常工作。

      switch(a) {
        case('MAIN_DOMAINAME'):
        case('DOMAIN_SERIAL'):
        case('DOMAIN_REFRESH'):
        case('DOMAIN_RETRY'):
          console.log('Go wild.');
        break;
      }
      

      不像其他答案那么轻量级,但它可读且匹配 (a === b)。

      【讨论】:

        【解决方案5】:

        我更喜欢 adeneo 已经提供的正则表达式解决方案,但如果你想要匹配的东西

        if a is one of (...
        

        问题的措辞相当接近,您可以这样做:

        if (a in list("MAIN_DOMAINNAME", "DOMAIN_SERIAL", "DOMAIN_REFRESH", "DOMAIN_RETRY")) {
            // do something                 (rest of list omitted to avoid scrolling)
        }
        

        通过提供帮助函数将列表转换为对象:

        function list() {
           var o={}, i;
           for (i=0; i < arguments.length; i++) o[arguments[i]] = true;
           return o;
        }
        

        当然你可以省略辅助函数而只使用一个对象字面量,但这很丑:

        if (a in {"MAIN_DOMAINNAME":1, "DOMAIN_SERIAL":1, "DOMAIN_REFRESH":1}) {
        

        【讨论】:

          猜你喜欢
          • 2014-06-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-09-07
          • 2011-11-20
          • 1970-01-01
          • 2011-06-13
          • 1970-01-01
          相关资源
          最近更新 更多