确定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中修改Object
和Array
原型可能导致严重的错误。 您需要决定在自己的环境中这样做是否安全。 首先要注意的是迭代一个数组(当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,请参阅这些示例:
- http://phpjs.org/functions/in_array:432
- http://www.bitrepository.com/equivalent-of-phps-in_array-function.html
- http://codingforums.com/showthread.php?t=63796
文体上的注意: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。