在SQL中,我们可以看到字符串是否在列表中,如下所示:
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
}
或者可以使用切换功能:
var str = 'a',
flag = false;
switch (str) {
case 'a':
case 'b':
case 'c':
flag = true;
default:
}
if (expression1 || expression2 || flag) {
// do something
}
但这是一个可怕的混乱。有什么想法吗?
在这种情况下,我必须使用Internet Explorer 7作为企业内部网页面。因此,如果没有一些语法糖,['a', 'b', 'c'].indexOf(str) !== -1
将无法原生工作。
答案 0 :(得分:239)
您可以致电indexOf
:
if (['a', 'b', 'c'].indexOf(str) >= 0) {
//do something
}
答案 1 :(得分:129)
如果您使用的是ES6,则可以构建项目数组,并使用includes
:
['a', 'b', 'c'].includes('b')
这比indexOf
有一些固有的好处,因为它可以正确测试列表中NaN
的存在,并且可以匹配缺少的数组元素,例如[1, , 2]
中的中间数组元素undefined
。 includes
也适用于JavaScript typed arrays,例如Uint8Array
。
您可以向字符串添加新的isInList
属性,如下所示:
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
执行相同的操作。
如果您使用的是现代浏览器,indexOf
始终有效。但是,对于IE8及更早版本,您需要一个polyfill。
如果indexOf
返回-1,则该项目不在列表中。但请注意,此方法无法正确检查NaN
,虽然它可以匹配显式undefined
,但它无法将缺少的元素与undefined
中的数组匹配,如同数组{ {1}}。
[1, , 2]
的Polyfill,或缺少它的任何其他浏览器您始终可以使用standards-compliant custom polyfill在旧版浏览器中使用此功能。
在我必须为Internet Explorer 7制作解决方案的情况下,我“推出了我自己的”更简单版本的indexOf
函数,该函数不符合标准:
indexOf()
但是,我不认为从长远来看修改if (!Array.prototype.indexOf) {
Array.prototype.indexOf = function(item) {
var i = this.length;
while (i--) {
if (this[i] === item) return i;
}
return -1;
}
}
是最好的答案。在JavaScript中修改Array.prototype
和Object
原型可能会导致严重的错误。您需要决定在您自己的环境中这样做是否安全。首要注意的是,使用Array
迭代数组(当Array.prototype添加属性时)将返回新函数名称作为其中一个键:
for ... in
您的代码现在可以正常运行,但是当有人在将来添加第三方JavaScript库或插件时,不会热心防范继承密钥,一切都会破坏。
在枚举过程中,避免破坏的旧方法是检查每个值,以查看对象是否实际将其作为具有Array.prototype.blah = function() { console.log('blah'); };
let arr = [1, 2, 3];
for (let x in arr) { console.log(x); }
// Result:
0
1
2
blah // Extra member iterated over!
和的的非继承属性使用if (arr.hasOwnProperty(x))
。
新的ES6避免这个额外关键问题的方法是使用x
而不是of
,in
。但是,除非您能保证所有代码和第三方库都严格遵守此方法,否则就本问题而言,您可能只想使用上述for (let x of arr)
。
答案 2 :(得分:51)
大多数答案都提出了Array.prototype.indexOf
方法,唯一的问题是它在IE9之前的任何 IE版本都不起作用。
作为替代方案,我给你留下了两个适用于所有浏览器的选项:
if (/Foo|Bar|Baz/.test(str)) {
// ...
}
if (str.match("Foo|Bar|Baz")) {
// ...
}
答案 3 :(得分:25)
数组有一个indexOf
方法,可用于搜索字符串:
js> a = ['foo', 'bar', 'baz']
foo,bar,baz
js> a.indexOf('bar')
1
js> a.indexOf('quux')
-1
答案 4 :(得分:11)
我使用的技巧是
>>> ("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
答案 5 :(得分:8)
这是我的:
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
答案 6 :(得分:6)
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'));
答案 7 :(得分:5)
除了indexOf
(其他海报提出的建议)之外,使用原型Enumerable.include()可以使这更加简洁明了:
var list = ['a', 'b', 'c'];
if (list.include(str)) {
// do stuff
}
答案 8 :(得分:5)
看起来你需要使用in_array函数。
jQuery - &gt; inArray
原型 - &gt; Array.indexOf
或者,如果您不使用jQuery或Prototype,请参阅以下示例:
文体说明: 名为thisthing that something的变量应该被命名为告诉你它们包含的内容(名词)。
答案 9 :(得分:2)
感谢您提出问题,以及使用Array.indexOf方法的解决方案。
我使用此解决方案中的代码创建了一个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
}
答案 10 :(得分:1)
使用indexOf(不适用于IE8)。
if (['apple', 'cherry', 'orange', 'banana'].indexOf(value) >= 0) {
// found
}
要支持IE8,您可以实现Mozilla的indexOf。
if (!Array.prototype.indexOf) {
// indexOf polyfill code here
}
通过String.prototype.match(文档)进行正则表达式。
if (fruit.match(/^(banana|lemon|mango|pineapple)$/)) {
}
答案 11 :(得分:0)
我很惊讶没有人提到过带字符串和列表的简单函数。
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));
答案 12 :(得分:0)
我的解决方案产生如下语法:
// Checking to see if var 'column' is in array ['a', 'b', 'c']
if (column.isAmong(['a', 'b', 'c']) {
// Do something
}
我通过扩展基本的Object原型来实现这一点,如下所示:
Object.prototype.isAmong = function (MyArray){
for (var a=0; a<MyArray.length; a++) {
if (this === MyArray[a]) {
return true;
}
}
return false;
}
我们也可以将方法命名为isInArray(但可能不是inArray)或简单地命名为。
优点:简单,直接,自我记录。
答案 13 :(得分:0)
var urllist = [];
var p = null;
for (var i = 0; i < spans.length - 1; i++) {
p = $(spans[i]).find('input').val();
if (urllist.indexOf(p) >= 0) {
growl.warning("input fields contains Duplicate Entries");
return;
}
urllist.push(p)
};
答案 14 :(得分:0)
r = (['.', 'ArrowLeft', 'ArrowRight',
'Delete','Backspace'].filter(k => k === '.').length === 1);
console.log(r);
这将检查“。”在列表中。
答案 15 :(得分:-1)
SLaks' answer的简化版也有效:
if ('abcdefghij'.indexOf(str) >= 0) {
// Do something
}
....因为字符串本身就是一种数组。 :)
如果需要,请按照我之前的描述实现Internet Explorer的indexof功能。