【问题标题】:IN Operator in Javascript functions like the one in SQLJavascript 函数中的 IN 运算符,类似于 SQL 中的运算符
【发布时间】:2012-12-15 23:45:11
【问题描述】:

我尝试了以下方法,但它引发了异常:

                if (!$get('sslot_hf0').value in ('X', 'Y', 'Z', '0')) {
                $get('sslot_hf0').value = 'X';
            }

我正在寻找类似于SQL 中的IN 运算符的函数

【问题讨论】:

  • 在 javascript 中使用 in 运算符。我不确定你想要实现的目标是否可以用这个developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/…
  • 为了完整起见,JavaScript中的in用于测试一个属性是否存在于一个Object中。由于 JavaScript 数组实际上是专门的对象,因此事情变得更加复杂,因此将 in 与数组一起使用是有效的,但可能不是您想的那样。它测试某些东西是否是数组对象的有效属性,但不测试它是否是数组本身中的现有值。

标签: javascript in-operator


【解决方案1】:

in 在 Javascript 中的功能不同。您必须使用 ||(或 OR)运算符将它们拆分。

【讨论】:

    【解决方案2】:

    你可以做到这一点,非常简单,将值存储在一个数组中并使用IN

      var temparr = ['x', 'y', 'z', '0'];
         if (!$get('sslot_hf0').value in temparr) {
                    $get('sslot_hf0').value = 'X';
                }
    

    希望对你有帮助

    【讨论】:

    • 'z' in ['x', 'y', 'z', '0'] 返回 false... 阅读 docs 您必须指定属性名称,而不是值。
    【解决方案3】:

    您可以使用indexOf

    ['X', 'Y', 'Z', '0'].indexOf('Z')
    > 2
    ['X', 'Y', 'Z', '0'].indexOf('T')
    > -1
    
    if (['X', 'Y', 'Z', '0'].indexOf($get('sslot_hf0').value) !== -1) {
      //...
    }
    

    【讨论】:

    • 出于这个原因,它为您提供了包含在页面中的算法:)
    • @sachleen,感谢您的回答,似乎indexof 可以很好地替代IN 功能,例如SQL,但是,您使用的代码会引发异常$get is not defined ,你有解释为什么indexof 不能识别'$get'函数吗?
    • 那是你的代码,不是我的。有关该功能的用法,请参见前两行和文档。如果$get 未在此处定义,则它也未在您的问题代码中定义。
    • @sachleen,我认为这与IndexOf 有关,这就是我问你的原因,但是,它不相关,
    【解决方案4】:

    如果你想要有用的集合操作函数并且不介意添加库,请查看underscorejs

    否则期望编写 for 循环来循环值并执行相等性检查。

    【讨论】:

      【解决方案5】:

      您可以将以下函数用于相同目的,第二个参数可以是数组或对象,第一个参数是您在数组或对象中搜索的值。

         function inStruct(val,structure)
              {
      
                for(a in structure)
                   {
                     if(structure[a] == val)
                       {
                         return true;
                       }
                   }
                 return false;
              }
      if(inStruct('Z',['A','B','Z']))
          {
             //do your stuff
          }
      

      //这个函数也遍历继承的属性

      即在某些您包含的 js 库中

      Array.prototype.foo = 10;
      

       instruct(10,[1,2,3]) // will return true
      

      对象也会发生同样的情况。检查这个小提琴 http://jsfiddle.net/rQ8AH/17/

      已编辑 ::

      谢谢大家的cmets ...这是更新的代码,我认为最好保留旧功能。所以,有人会注意到其中的不同。

      function inStruct(val,structure)
          {
      
            for(a in structure)
               {
      
                 if(structure[a] == val && structure.hasOwnProperty(a))
                   {
                     return true;
                   }
               }
             return false;
          }
      

      【讨论】:

      • 这是迄今为止最好的替代品,其他答案可能有效,但浏览器兼容性很重要。 Thnaks @rupesh-patel
      • 如果 Array 原型有其他属性,这段代码可能会出现意想不到的结果。
      • @sachleen,请您澄清一下您所说的其他属性是什么意思。
      • console.log(inStruct('T',['A','B','Z'])); Array.prototype.foo = 'T'; console.log(inStruct('T',['A','B','Z'])); - 将返回 false(预期)、true(意外)
      • 你是对的@sachleen,在数组迭代中使用“for ...in”是一个坏主意,我已经完成了 [this question](stackoverflow.com/questions/500504/…) 一个解决方案是替换inStruct下列要求:function inStruct(val,structure) 987654332 for(var i = 0; i < structure.length; i += 1) 987654334 if(structure[i] == val) 987654336 return true; 987654338 } 987654340 }感谢您的贡献sachleen,我希望@Rupesh更新这个答案
      【解决方案6】:

      创建一个数组

      并使用 jquery.inArray() 来检查

      阅读这里了解更多http://api.jquery.com/jQuery.inArray/

      【讨论】:

        【解决方案7】:

        SQL:

        something in ('X','Y','Z','0')
        

        现代 JavaScript(包括 IE>8):

        ['X','Y','Z','0'].indexOf(something)>-1
        

        更现代的 JavaScript (!IE):

        ['X','Y','Z','0'].includes(something)
        

        如果你需要一个简单的includes polyfill 用于旧版浏览器(包括 IE):

        if(!Array.prototype.includes) Array.prototype.includes =function(value,start) {
            start=parseInt(start)||0;
            for(var i=start;i<this.length;i++) if(this[i]==value) return true;
            return false;
        };
        

        根据 AuxTaco 的评论,这是适用于 IE>8 的 polyfill 版本:

        if (!Array.prototype.includes) Object.defineProperty(Array.prototype, 'includes', {
            value: function(value,start) {
                start=parseInt(start)||0;
                for(var i=start;i<this.length;i++) if(this[i]==value) return true;
                return false;
            }
        });
        

        【讨论】:

        • 真正的array.includes 是不可枚举的。使用Object.defineProperty
        • @AuxTaco 感谢您的评论。我在答案中添加了一个变体,尽管它确实需要 IE>8。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-27
        • 1970-01-01
        • 1970-01-01
        • 2012-01-04
        • 2011-04-03
        • 1970-01-01
        相关资源
        最近更新 更多