确定string是否在JavaScript中列表中

在SQL中,我们可以看到一个string是否在列表中,如下所示:

Column IN ('a', 'b', 'c') 

什么是在JavaScript中做到这一点的好方法? 这样做太笨拙了:

 if (expression1 || expression2 || str === 'a' || str === 'b' || str === 'c') { // do something } 

而我不确定这个的性能或清晰度:

 if (expression1 || expression2 || {a:1, b:1, c:1}[str]) { // do something } 

或者可以使用开关function:

 var str = 'a', flag = false; switch (str) { case 'a': case 'b': case 'c': flag = true; default: } if (expression1 || expression2 || flag) { // do something } 

但这是一个可怕的混乱。 有任何想法吗?

在这种情况下,我必须使用Internet Explorer作为企业内部网页面。 所以['a', 'b', 'c'].indexOf(str) !== -1在没有语法糖的情况下将不能工作。

你可以调用indexOf

 if (['a', 'b', 'c'].indexOf(str) >= 0) { //do something } 

大多数的答案build议Array.prototype.indexOf方法,唯一的问题是它不会在IE9之前的任何 IE版本。

作为另一种select,我给你两个更多的选项,将在所有浏览器上工作:

 if (/Foo|Bar|Baz/.test(str)) { // ... } if (str.match("Foo|Bar|Baz")) { // ... } 

EcmaScript 6

如果您使用的是ES6,则可以构build这些项目的数组,并使用includes

 ['a', 'b', 'c'].includes('b') 

没有数组

你可以添加一个新的isInList属性到string,如下所示:

 if (!String.prototype.isInList) { String.prototype.isInList = function() { let value = this.valueOf(); for (let i = 0, l = arguments.length; i < l; i += 1) { if (arguments[i] === value) return true; } return false; } } 

然后像这样使用它:

 'fox'.isInList('weasel', 'fox', 'stoat') // true 'fox'.isInList('weasel', 'stoat') // false 

你可以为Number.prototype做同样的事情。

使用IE8及更早版本的索引填充

在ES6之外,你可以在大多数浏览器(IE8和更早版本不是“最”)中使用indexOf做同样的事情。

在这种情况下,我最终使用了indexOf()函数,并将“自己推出”用于Internet Explorer 7。

 if (!Array.prototype.indexOf) { Array.prototype.indexOf = function(item) { var i = this.length; while (i--) { if (this[i] === item) return i; } return -1; } } 

但是,从长远来看,我不认为修改Array.prototype是最好的答案。 在JavaScript中修改ObjectArray原型可能导致严重的错误。 您需要决定在自己的环境中这样做是否安全。 首先要注意的是迭代一个数组(当Array.prototype添加属性时)with for ... in将返回新的函数名称作为键之一:

 Array.prototype.blah = function() { console.log('blah'); }; for (var x in [1, 2, 3]) { console.log(x); } // Result: 0 1 2 blah // Extra member iterated over 

数组有一个可用于searchstring的indexOf方法:

 js> a = ['foo', 'bar', 'baz'] foo,bar,baz js> a.indexOf('bar') 1 js> a.indexOf('quux') -1 

我用过的一个技巧是

 >>> ("something" in {"a string":"", "somthing":"", "another string":""}) false >>> ("something" in {"a string":"", "something":"", "another string":""}) true 

你可以做类似的事情

 >>> a = ["a string", "something", "another string"]; >>> b = {}; >>> for(var i=0; i<a.length;i++){b[a[i]]="";} /* Transform the array in a dict */ >>> ("something" in b) true 

这是我的:

 String.prototype.inList=function(list){ return (Array.apply(null, arguments).indexOf(this.toString()) != -1) } var x = 'abc'; if (x.inList('aaa','bbb','abc')) console.log('yes'); else console.log('no'); 

如果你传递一个数组,那么这个更快:

 String.prototype.inList=function(list){ return (list.indexOf(this.toString()) != -1) } var x = 'abc'; if (x.inList(['aaa','bbb','abc'])) console.log('yes') 

这里是jsperf: http ://jsperf.com/bmcgin-inlsit

RegExp是普遍的,但我知道你正在使用数组。 所以,看看这个方法。 我使用它,它是非常有效的,快速的!

 var str = 'some string with a'; var list = ['a', 'b', 'c']; var rx = new RegExp(list.join('|')); rx.test(str); 

您也可以应用一些修改,即:

一衬垫

 new RegExp(list.join('|')).test(str); 

不区分大小写

 var rx = new RegExp(list.join('|').concat('/i')); 

还有其他许多人!

看起来你需要使用in_array函数。

jQuery – > inArray

Prototype – > Array.indexOf

或者,如果您不使用jQuery或Prototype,请参阅这些示例:

文体上的注意:variables命名thisthing的东西,应该被命名告诉你什么他们包含(名词)。

除了indexOf (其他海报build议),使用原型的Enumerable.include()可以使这个更简洁明了:

 var list = ['a', 'b', 'c']; if (list.include(str)) { // do stuff } 

感谢您的问题,以及使用Array.indexOf方法的解决scheme。

我使用这个解决scheme的代码来创build一个inList()函数,这个函数可以让IMO更简单,更清晰:

 function inList(psString, psList) { var laList = psList.split(','); var i = laList.length; while (i--) { if (laList[i] === psString) return true; } return false; } 

用法:

 if (inList('Houston', 'LA,New York,Houston') { // THEN do something when your string is in the list } 

我很惊讶没有人提到了一个简单的函数,需要一个string和一个列表。

 function in_list(needle, hay) { var i, len; for (i = 0, len = hay.length; i < len; i++) { if (hay[i] == needle) { return true; } } return false; } var alist = ["test"]; console.log(in_list("test", alist)); 

SLaks的答案的简化版本也适用:

 if ('abcdefghij'.indexOf(str) >= 0) { // Do something } 

….因为string本身就是一些数组。 🙂

如果需要的话,像我之前所描述的那样实现Internet Explorer的indexoffunction。

我的解决scheme的结果是这样的语法:

 // Checking to see if var 'column' is in array ['a', 'b', 'c'] if (column.isAmong(['a', 'b', 'c']) { // Do something } 

我通过扩展基本对象原型来实现这一点,如下所示:

 Object.prototype.isAmong = function (MyArray){ for (var a=0; a<MyArray.length; a++) { if (this === MyArray[a]) { return true; } } return false; } 

我们也可以命名方法isInArray(但可能不是inArray)或简单地isIn。

优点:简单,直接,自我logging。