JavaScript函数中的IN运算符类似于SQL中的运算符。

7
我尝试了以下方法,但它抛出了异常:
                if (!$get('sslot_hf0').value in ('X', 'Y', 'Z', '0')) {
                $get('sslot_hf0').value = 'X';
            }

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


JavaScript中in运算符的使用。我不确定您想要实现的内容是否可以使用此运算符完成。https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/in - Raab
为了完整起见,在JavaScript中,“in”用于测试对象中是否存在属性。事情变得更加复杂,因为JavaScript数组实际上是专门的对象,因此在数组中使用“in”是有效的,但可能不是您想要的。它测试某个东西是否是数组对象的有效属性,但并不测试它是否是数组本身的现有值。 - Manngo
7个回答

4
你可以使用 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
@sachleen,感谢您的回答,似乎indexofSQLIN功能的良好替代品。然而,您使用的代码抛出了异常“$get未定义”,您能否解释一下为什么indexof无法识别“$get”函数? - Alaa Alweish
那是你的代码,不是我的。请查看函数的前两行和文档以了解用法。如果 $get 在这里未定义,则在您的问题代码中也未定义。 - sachleen
@sachleen,我以为这与IndexOf有关,所以问了你,但实际上并不相关。 - Alaa Alweish

2

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填充程序来支持旧版浏览器(包括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
@AuxTaco 感谢您的评论。我已经添加了一个变体到答案中,但它需要IE>8。 - Manngo

2
您可以使用以下函数来实现相同的目的,第二个参数可以是数组或对象,而第一个参数是您在数组或对象中搜索的值。
   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;

than

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

同样的情况也会发生在对象上。请查看这个演示:http://jsfiddle.net/rQ8AH/17/ 编辑:谢谢大家的评论...这是更新后的代码,我认为保留旧函数更好。这样某些人就可以注意到区别了。
function inStruct(val,structure)
    {

      for(a in structure)
         {

           if(structure[a] == val && structure.hasOwnProperty(a))
             {
               return true;
             }
         }
       return false;
    }

1
这是目前最好的替代方案,其他答案可能也有效,但浏览器兼容性是一个主要问题。谢谢 @rupesh-patel - Alaa Alweish
如果数组原型具有其他属性,则此代码可能会产生意外结果。 - sachleen
@sachleen,请问您能否澄清一下您所说的其他属性是什么意思。 - Alaa Alweish
1
console.log(inStruct('T',['A','B','Z'])); Array.prototype.foo = 'T'; console.log(inStruct('T',['A','B','Z'])); - 将返回 false(预期),true(意外) - sachleen
1
你说得对@sachleen,使用“for ...in”进行数组迭代是一个坏主意,我已经浏览了这个问题。其中一个解决方案是用以下代码替换inStructfunction inStruct(val,structure) { for(var i = 0; i < structure.length; i += 1) { if(structure[i] == val) { return true; } } return false; }感谢您的贡献sachleen,我希望@Rupesh更新这个答案。 - Alaa Alweish

1

in 在Javascript中的功能不同。您需要使用多个比较,并使用||(或OR)运算符进行拆分。


0
如果你想要有用的集合操作函数,而且不介意添加一个库,请查看underscorejs
否则,你需要编写for循环来遍历值并执行相等性检查。

0

-1

你可以这样做,简单易行,将值存储在数组中并使用IN

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

希望这能帮到你。

1
"'z' in ['x', 'y', 'z', '0']" 返回 false... 请查看文档,需要指定一个属性名而不是值。 - sachleen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接