确定字符串是否在JavaScript中列表中

时间:2010-03-12 01:53:46

标签: javascript string list

在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将无法原生工作。

16 个答案:

答案 0 :(得分:239)

您可以致电indexOf

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

答案 1 :(得分:129)

EcmaScript 6

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

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

这比indexOf有一些固有的好处,因为它可以正确测试列表中NaN的存在,并且可以匹配缺少的数组元素,例如[1, , 2]中的中间数组元素undefinedincludes也适用于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执行相同的操作。

Array.indexOf

如果您使用的是现代浏览器,indexOf始终有效。但是,对于IE8及更早版本,您需要一个polyfill。

如果indexOf返回-1,则该项目不在列表中。但请注意,此方法无法正确检查NaN,虽然它可以匹配显式undefined,但它无法将缺少的元素与undefined中的数组匹配,如同数组{ {1}}。

Internet Explorer 8及更早版本中的[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.prototypeObject原型可能会导致严重的错误。您需要决定在您自己的环境中这样做是否安全。首要注意的是,使用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而不是ofin。但是,除非您能保证所有代码和第三方库都严格遵守此方法,否则就本问题而言,您可能只想使用上述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功能。