【问题标题】:JavaScript: Simple way to check if variable is equal to two or more values? [duplicate]JavaScript:检查变量是否等于两个或多个值的简单方法? [复制]
【发布时间】:2012-08-20 10:14:30
【问题描述】:

有没有更简单的方法可以判断一个变量是否等于某个范围的值,比如:

if x === 5 || 6 

而不是像这样钝的东西:

if x === 5 || x === 6

?

【问题讨论】:

  • 你为什么认为后者迟钝?
  • 因为我需要编写一些代码来检查变量是否具有 20 个值之一,即 if x = "New York" || 《奥斯汀》|| “阿尔伯塔”等
  • @AdamTempleton:将所有值放入一个数组中,然后使用indexOf,或者您也可以使用正则表达式/^(New York|Austin|Alberta)$/.test(x)
  • @AdamTempleton 在这种情况下,您应该重写您的问题。您在主题中特别说两个
  • 使用 s = new Set([5, 6]); s.has(x);。不知道为什么我不能回答这个问题。

标签: javascript comparison


【解决方案1】:

您可以将值存储在数组中,并使用[].indexOf检查该变量是否存在于数组中:

if([5, 6].indexOf(x) > -1) {
  // ...
}

如果返回-1,则该变量不存在于数组中。

【讨论】:

  • 这在 IE MDN's Array#indexOf Compatibility section 了解您可以插入以使其在 IE 中实际运行的代码。但是,除非您在多个地方使用它,否则使用a == 1 || a == 2 可能会更快。
  • 另外,如果您使用的是 JS 框架,MooTools 和 Prototype 都确保 Array#indexOf 存在。另一方面,jQuery 以$.inArray 的形式提供了自己的实现。我不熟悉任何其他框架,但我确信它们都以某种方式包含此类功能。
  • 对代码多一点描述会很好。
  • 现在我们有了['a','b'].includes('a')
【解决方案2】:

完全没问题。如果您有更长的值列表,也许您可​​以使用以下内容:

if ([5,6,7,8].indexOf(x) > -1) {
}

【讨论】:

    【解决方案3】:

    是的。您可以使用自己的功能。本例使用.some

    var foo = [ 5, 6 ].some(function(val) {
         return val === x;
       });
    
    foo; // true
    

    【讨论】:

    • 为 .some 投了赞成票,这是我以前从未见过的!
    • 我认为 .some 只有 IE9 或更高版本。
    【解决方案4】:

    简单的答案是否定的。您可以使用 switch 语句,如果您要比较大量字符串值,这将更容易阅读,但将它用于两个值不会看起来更好。

    【讨论】:

      【解决方案5】:

      取决于您执行的测试类型。如果你有静态字符串,这很容易通过正则表达式检查:

      if (/^[56ab]$/.test(item)) {
      //-or-
      if (/^(foo|bar|baz|fizz|buzz)$/.test(item)) {
          doStuff();
      } else {
          doOtherStuff();
      }
      

      如果您有一小部分值(字符串或数字),您可以使用switch

      switch (item) {
      case 1:
      case 2:
      case 3:
          doStuff();
          break;
      default:
          doOtherStuff();
          break;
      }
      

      如果您的值列表很长,您可能应该使用带有~arr.indexOf(item)arr.contains(item) 的数组:

      vals = [1,3,18,3902,...];
      if (~vals.indexOf(item)) {
          doStuff();
      } else {
          doOtherStuff();
      }
      

      很遗憾,某些浏览器不支持Array.prototype.indexOf。幸运的是a polyfill is available。如果你遇到了 polyfill Array.prototype.indexOf 的麻烦,你不妨添加 Array.prototype.contains

      根据您关联数据的方式,您可以将字符串的动态列表存储在对象内作为其他相关信息的映射:

      var map = {
          foo: bar,
          fizz: buzz
      }
      if (item in map) {
      //-or-
      if (map.hasOwnProperty(item)) {
          doStuff(map[item]);
      } else {
          doOtherStuff();
      }
      

      in 会检查整个原型链,而Object.prototype.hasOwnProperty 只会检查对象,所以要注意它们是不同的。

      【讨论】:

        【解决方案6】:

        不,可能有一些针对特定情况的技巧,但通常我会编写如下代码:

        if (someVariable === 1 ||
            someVariable === 2 ||
            someVariable === 7 ||
            someVariable === 12 ||
            someVariable === 14 ||
            someVariable === 19) {
        
            doStuff();
            moreStuff();
        
        } else {
            differentStuff();
        }
        

        【讨论】:

          【解决方案7】:

          这是我决定使用的:

          Object.prototype.isin = function() {
              for(var i = arguments.length; i--;) {
                  var a = arguments[i];
                  if(a.constructor === Array) {
                      for(var j = a.length; j--;)
                          if(a[j] == this) return true;
                  }
                  else if(a == this) return true;
              }
              return false;
          }
          

          你会这样使用它:

          var fav   = 'pear',
              fruit = ['apple', 'banana', 'orange', 'pear'],
              plu   = [4152, 4231, 3030, 4409];
          
          if (fav.isin(fruit, plu, 'eggs', 'cheese')) {
              //do something cool
          }
          

          优点是:

          • 它可以在 IE
          • 自然地从左到右阅读;
          • 您可以为其提供数组或单独的值。

          如果您不想允许类型强制(indexOf 不允许),请将两个 == 更改为 ===。就目前而言:

          fav = "4231";
          plu.indexOf(fav) //-1
          fav.isin(plu)    //true
          

          【讨论】:

            【解决方案8】:

            [编辑] 这似乎有效,但正如 Dan 指出的那样,它实际上是误报。不要使用这种方法。我把它留在这里是为了教育目的。

            我知道的最简单的方法:

            a = [1,2,3,4,5];
            
            if(3 in a) alert("true"); // will alert true
            

            在 Chrome 控制台中测试。不确定它是否适用于其他浏览器。

            【讨论】:

            • 这个例子是偶然的。试试3 in [1, 3] - 它将返回false,因为数组[1, 3] 中没有索引为3 的元素。就此而言,3 in ['a', 'b', 'c', 'd'] 将返回 true。
            • 该死,所以这是误报。谢谢你。
            猜你喜欢
            • 2012-08-25
            • 2023-04-09
            • 2019-11-17
            • 2011-11-20
            • 1970-01-01
            • 2021-10-10
            • 2014-02-24
            • 2023-01-19
            相关资源
            最近更新 更多