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

2020/10/07 22:01 · javascript ·  · 0评论

在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,因为它用于公司Intranet页面。因此,['a', 'b', 'c'].indexOf(str) !== -1没有一些语法糖就无法在本地运行。

您可以致电indexOf

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

EcmaScript 6

如果您使用的是ES6,最干净的方法是构造一系列项目并使用Array.includes

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

这样做有一些内在的好处,indexOf因为它可以正确测试NaN列表中是否存在,并且可以将缺少的数组元素(例如中间的元素)匹配[1, , 2]到中undefinedincludes也适用于JavaScript类型的数组,例如Uint8Array

如果您担心浏览器支持(例如IE或Edge),可以在CanIUse.Com上进行检查Array.includes,并且如果要定位缺少的浏览器或浏览器版本,includes建议使用polyfill.io进行polyfilling。

没有数组

您可以isInList向字符串添加新属性,如下所示:

if (!String.prototype.isInList) {
  Object.defineProperty(String.prototype, 'isInList', {
    get: () => function(...args) {
      let value = this.valueOf();
      for (let i = 0, l = args.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

请注意,Object.defineProperty不能在IE8和更早版本或其他浏览器的旧版本中使用。但是,这是一个非常优越的解决方案,String.prototype.isInList = function() { ... }因为使用这样的简单赋值将在上创建一个可枚举的属性String.prototype,这很可能会破坏代码。

Array.indexOf

如果您使用的是现代浏览器,则indexOf始终可以使用。但是,对于IE8和更早版本,您将需要一个polyfill。

如果indexOf返回-1,则该项目不在列表中。请注意,此方法将无法正确检查NaN,尽管它可以匹配显式undefined,但不能将缺少的元素undefined与array中的匹配[1, , 2]

适用于IEindexOfincludesIE中的Polyfill ,或任何其他缺乏支持的浏览器/版本

如果您不想使用如上所述的诸如polyfill.io之类的服务,则始终可以在自己的源代码中包括符合标准的自定义polyfill。例如,Mozilla开发人员网络有一个用于indexOf

在这种情况下,我必须为Internet Explorer 7解决方案,我“滚动了自己的”indexOf()不符合标准功能的简单版本

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添加属性时)for ... in将返回新函数名称作为键之一:

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!

您的代码现在可以正常工作,但是将来某人添加第三方JavaScript库或插件时,如果他们不热衷于防止继承的键,则一切都可能会中断。

避免破损的旧方法是在枚举期间检查每个值,以查看对象是否确实将其作为具有非继承属性的对象if (arr.hasOwnProperty(x))然后再使用该对象x

避免这种额外密钥问题的新ES6方法是:

  1. 使用of替代infor (let x of arr)但是,除非您可以保证所有代码和第三方库都严格遵守此方法,否则出于此问题的目的,您可能只想includes如上所述使用

  2. 使用定义原型上的新属性Object.defineProperty(),因为这将使属性(默认情况下)不可枚举。仅当您使用的所有JavaScript库或模块也都这样做时,才能真正解决问题。

大多数答案都建议使用该Array.prototype.indexOf方法,唯一的问题是,它在IE9之前的任何IE版本上均不起作用

作为替代方案,我为您提供了两个可以在所有浏览器上使用的选项:

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


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

数组具有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'));

还有很多!

除了indexOf(其他张贴者建议的那样)之外,使用原型的Enumerable.include()可以使此操作更简洁明了:

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

使用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(docs)进行正则表达式。

if (fruit.match(/^(banana|lemon|mango|pineapple)$/)) {

}

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

jQuery-> inArray

原型-> Array.indexOf

或者,如果您不使用jQuery或Prototype,请参见以下示例:

风格注释:应命名为thisthing thatthing的变量,以告诉您有关其所包含内容的信息(名词)。

感谢您提出的问题,以及使用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
}

我很惊讶,没有人提到一个简单的函数,它需要一个字符串和一个列表。

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));

我的解决方案产生这样的语法:

// 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)或简单地命名为isIn。

优点:简单,直接和可自我记录。

SLaks答案的简化版本也可以使用:

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

....因为字符串本身就是数组。:)

如果需要,请按照我之前的描述为Internet Explorer实现indexof函数。

本文地址:http://javascript.askforanswer.com/quedingzifuchuanshifouzaijavascriptliebiaozhong.html
文章标签: ,   ,  
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!