如何在javascript中检查数组是否包含值?

6qqygrtg  于 2021-09-13  发布在  Java
关注(0)|答案(21)|浏览(412)

找出javascript数组是否包含值的最简洁有效的方法是什么?
这是我知道的唯一方法:

function contains(a, obj) {
    for (var i = 0; i < a.length; i++) {
        if (a[i] === obj) {
            return true;
        }
    }
    return false;
}

有没有更好更简洁的方法来实现这一点?

csbfibhn

csbfibhn16#

假设您定义了这样一个数组:

const array = [1, 2, 3, 4]

下面是三种检查是否存在错误的方法 3 在那里。他们也都回来了 truefalse .

本机数组方法(自es2016起)(兼容性表)

array.includes(3) // true

作为自定义数组方法(es2016之前)

// Prefixing the method with '_' to avoid name clashes
Object.defineProperty(Array.prototype, '_includes', { value: function (v) { return this.indexOf(v) !== -1 }})
array._includes(3) // true

简单函数

const includes = (a, v) => a.indexOf(v) !== -1
includes(array, 3) // true
ldfqzlk8

ldfqzlk817#

最上面的答案假定为基本类型,但如果您想知道数组是否包含具有某种特征的对象,则array.prototype.some()是一个优雅的解决方案:

const items = [ {a: '1'}, {a: '2'}, {a: '3'} ]

items.some(item => item.a === '3')  // returns true
items.some(item => item.a === '4')  // returns false

这样做的好处是,一旦找到元素,迭代就会中止,从而避免了不必要的迭代周期。
而且,它非常适合一个 if 语句,因为它返回布尔值:

if (items.some(item => item.a === '3')) {
  // do something
}
  • 正如jamess在评论中指出的那样,在2018年9月作出回答时, Array.prototype.some() 完全支持:caniuse.com支持表
9cbw7uwe

9cbw7uwe18#

ecmascript 7引入了 Array.prototype.includes .
它可以这样使用:

[1, 2, 3].includes(2); // true
[1, 2, 3].includes(4); // false

它还接受可选的第二个参数 fromIndex :

[1, 2, 3].includes(3, 3); // false
[1, 2, 3].includes(3, -1); // true

不像 indexOf ,它使用严格的相等比较, includes 使用samevaluezero相等算法进行比较。这意味着您可以检测数组是否包含 NaN :

[1, 2, NaN].includes(NaN); // true

也不像 indexOf , includes 不跳过缺少的索引:

new Array(5).includes(undefined); // true

目前,它仍然是一个草稿,但可以进行多填充以使其在所有浏览器上工作。

iyzzxitl

iyzzxitl19#

现代浏览器有 Array#includes ,它正是这样做的,并且得到了除ie以外的所有人的广泛支持:

console.log(['joe', 'jane', 'mary'].includes('jane')); //true

你也可以使用 Array#indexOf ,它不太直接,但对于过时的浏览器不需要多边形填充。

console.log(['joe', 'jane', 'mary'].indexOf('jane') >= 0); //true

许多框架也提供类似的方法:
jquery: $.inArray(value, array, [fromIndex]) 下划线.js: _.contains(array, value) (别名为 _.include_.includes )
dojo工具包: dojo.indexOf(array, value, [fromIndex, findLast]) 原型: array.indexOf(value) mootools: array.indexOf(value) mochikit: findValue(array, value) ms ajax: array.indexOf(value) 提取: Ext.Array.contains(array, value) 洛达斯: _.includes(array, value, [from]) (是 _.contains 先前版本(4.0.0)
拉姆达: R.includes(value, array) 请注意,一些框架将此作为函数实现,而另一些框架将此函数添加到阵列原型中。

20jt8wwn

20jt8wwn20#

indexOf 也许吧,但它是“ecma-262标准的javascript扩展;因此,它可能不会出现在标准的其他实现中。”
例子:

[1, 2, 3].indexOf(1) => 0
["foo", "bar", "baz"].indexOf("bar") => 1
[1, 2, 3].indexOf(4) => -1

afaics microsoft不提供某种替代方案,但您可以在internet explorer(以及其他不支持此功能的浏览器)的阵列中添加类似的功能 indexOf )如果你想的话,就像谷歌快速搜索显示的那样(例如,这一个)。

t30tvxxf

t30tvxxf21#

2019年更新:此答案来自2008年(11岁!)与现代js用法无关。承诺的性能改进是基于当时浏览器中的基准测试。它可能与现代js执行上下文无关。如果你需要一个简单的解决方案,寻找其他答案。如果您需要最佳性能,请在相关的执行环境中为自己进行基准测试。
正如其他人所说,通过数组进行迭代可能是最好的方法,但已经证明 while 循环是javascript中最快的迭代方式。因此,您可能希望按如下方式重写代码:

function contains(a, obj) {
    var i = a.length;
    while (i--) {
       if (a[i] === obj) {
           return true;
       }
    }
    return false;
}

当然,您也可以扩展阵列原型:

Array.prototype.contains = function(obj) {
    var i = this.length;
    while (i--) {
        if (this[i] === obj) {
            return true;
        }
    }
    return false;
}

现在,您可以简单地使用以下各项:

alert([1, 2, 3].contains(2)); // => true
alert([1, 2, 3].contains('2')); // => false

相关问题