javascript - array.contains( obj ) 在JavaScript

  显示原文与译文双语对照的内容

确定JavaScript数组是否包含对象的最简洁和最有效的方法?

这是我唯一知道的方法:


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

是否有更好和更简洁的方法来完成这里任务?

这是非常密切相关的堆栈溢出问题 最好办法找到一个项目在一个javascript数组? 使用 indexOf 在数组中查找对象。

时间:

Modern browsers have Array#indexOf, which does exactly that. This is in new(ish) ECMAScript 5 th edition specification, but it has had in several browsers for years. 使用该页面底部"兼容性"部分中列出的代码可以支持旧浏览器。

jQuery有一个用于这里目的的实用工具函数:


$.inArray(value, array)

它返回数组中数值的索引。 如果数组不包含值,则返回 -1.

jQuery有几个有用的实用工具函数

一个优秀的JavaScript工具库是 underscore.js:

  • _.contains(list, value) 。别名 _.include(list, value) 包含/包含( 下划线在内部使用,如果传递了一个JavaScript数组) 。

其他框架:

注意一些框架实现了一个函数,而另一些框架将函数添加到数组 Prototype 。

编译到JavaScript的语言

CoffeeScript 中,in 运算符与 contains 等效:


a = [1, 2, 3, 4]
alert(2 in a)

省 Dart:


var mylist = [1, 2, 3];
assert(mylist.contains(1));
assert(mylist.indexOf(1) == 0);

的更新:就像 @orip 中提到的,链接的基准在 2008中完成,所以结果可能与现代浏览器无关。 然而,你可能需要这个来支持non-modern浏览器,它们可能还没有被更新自。 总是为自己测试。

像别人说的,通过迭代数组可能是最好的方式,但它证明了降低 while 循环迭代在javascript中是最快的方法。 因此,你可能需要重写代码,如下所示:


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

当然,你也可以扩展数组 Prototype:


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

indexOf 也许,但它是一个"ECMA-262javascript扩展标准,因此它可能不会出现在其他的实现标准。"

例如:


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

AFAICS 微软不提供某种替代,但你可以将类似的功能添加到数组 IE ( 和其他不支持 indexOf的浏览器) 如果你想,作为一个谷歌搜索显示 ( 例如这一个 ) 。

这是一个 Javascript Array.indexOf 1.6兼容的实现:


if (!Array.indexOf)
{
 Array.indexOf = [].indexOf?
 function (arr, obj, from) { return arr.indexOf(obj, from); }:
 function (arr, obj, from) {//(for IE6)
 var l = arr.length,
 i = from? parseInt( (1*from) + (from<0? l:0), 10) : 0;
 i = i<0? 0 : i;
 for (; i<l; i++) {
 if (i in arr && arr[i] === obj) { return i; }
 }
 return -1;
 };
}

扩展 JavaScript Array 对象是一个非常糟糕的想法,因为你将新的属性( 你的自定义方法) 引入到 for-in 循环中,它可以破坏现有的脚本。 几年前,Prototype 库的作者不得不re-engineer实现它们的库实现来删除这种东西。

若不需要与其他worry compatibility reparacionjavascript如何以据你页,否则doc直截了当地,并加强free-standing细胞,目的awkwardsafer解决办法。

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

它可以是 polyfilled,使它在所有浏览器上工作。

我使用以下命令:


Array.prototype.contains = function (v) {
 return this.indexOf(v)> -1;
}

var a = [ 'foo', 'bar' ];

a.contains('foo');//true
a.contains('fox');//false

...