检查数组中是否存在元素

我现在用来检查这个的函数如下:

function inArray(needle,haystack)
{
var count=haystack.length;
for(var i=0;i<count;i++)
{
if(haystack[i]===needle){return true;}
}
return false;
}

它奏效了。我在寻找的是是否有更好的方法来做到这一点。

1404082 次浏览

只需使用indexOf

haystack.indexOf(needle) >= 0

如果您想支持旧的Internet Explorers(将您当前的代码作为解决方法。

除非你的列表被排序,否则你需要将每个值与针进行比较。因此,你的解决方案和indexOf平均都必须执行n/2比较。然而,由于indexOf是一个内置方法,它可能会使用额外的优化,并且在实践中会稍微快一点。请注意,除非你的应用程序在列表中搜索非常频繁(比如每秒1000次)或者列表非常大(比如100k条目的),否则速度差异并不重要。

代码:

function isInArray(value, array) {
return array.indexOf(value) > -1;
}

执行:

isInArray(1, [1,2,3]); // true

更新(2017):

在遵循ECMAScript 2016(ES7)标准的现代浏览器中,您可以使用函数Array.prototype.includes,这使得检查数组中是否存在项目变得更加容易:

const array = [1, 2, 3];
const value = 1;
const isInArray = array.includes(value);
console.log(isInArray); // true

您可以使用underscore.js库中的_contains函数来实现这一点:

if (_.contains(haystack, needle)) {
console.log("Needle found.");
};

在Lodash中,您可以使用_包括(它也_别名)

您可以搜索整个数组:

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

您可以从起始索引搜索数组:

_.includes([1, 2, 3], 1, 1);  // false (begins search at index 1)

搜索字符串:

_.includes('pebbles', 'eb');  // true (string contains eb)

也适用于检查简单的对象数组:

_.includes({ 'user': 'fred', 'age': 40 }, 'fred');    // true
_.includes({ 'user': 'fred', 'age': false }, false);  // true

关于最后一种情况需要注意的一点是,它适用于字符串、数字和布尔值等原语,但不能搜索数组或对象

_.includes({ 'user': 'fred', 'age': {} }, {});   // false
_.includes({ 'user': [1,2,3], 'age': {} }, 3);   // false

单行代码…将返回true或false

!!(arr.indexOf("val")+1)

从ECMAScript6开始,可以使用Set:

var myArray = ['A', 'B', 'C'];
var mySet = new Set(myArray);
var hasB = mySet.has('B'); // true
var hasZ = mySet.has('Z'); // false

ECMAScript 2016为数组合并了includes()方法,专门解决了这个问题,因此现在是首选方法。

[1, 2, 3].includes(2);     // true
[1, 2, 3].includes(4);     // false
[1, 2, 3].includes(1, 2);  // false (second parameter is the index position in this array at which to begin searching)

截至2018年7月,这个已经在几乎所有主要浏览器中实现,如果您需要支持较旧的浏览器,则可以使用的polyill。

编辑:请注意,如果数组中的项目是一个对象,则返回false。这是因为类似的对象在JavaScript中是两个不同的对象。

我在GoogleChrome52上对其进行了多次基准测试,但可以随意将其复制到任何其他浏览器的控制台中。


~1500 ms,包括(~2700 ms当我使用聚填充

var array = [0,1,2,3,4,5,6,7,8,9];
var result = 0;


var start = new Date().getTime();
for(var i = 0; i < 10000000; i++)
{
if(array.includes("test") === true){ result++; }
}
console.log(new Date().getTime() - start);

~1050 ms, indexOf

var array = [0,1,2,3,4,5,6,7,8,9];
var result = 0;


var start = new Date().getTime();
for(var i = 0; i < 10000000; i++)
{
if(array.indexOf("test") > -1){ result++; }
}
console.log(new Date().getTime() - start);

~650 ms,自定义功能

function inArray(target, array)
{


/* Caching array.length doesn't increase the performance of the for loop on V8 (and probably on most of other major engines) */


for(var i = 0; i < array.length; i++)
{
if(array[i] === target)
{
return true;
}
}


return false;
}


var array = [0,1,2,3,4,5,6,7,8,9];
var result = 0;


var start = new Date().getTime();
for(var i = 0; i < 10000000; i++)
{
if(inArray("test", array) === true){ result++; }
}
console.log(new Date().getTime() - start);

您可以使用indexOf,但在最新版本的Internet Explorer中无法正常工作。 代码:

function isInArray(value, array) {
return array.indexOf(value) > -1;
}

执行:

isInArray(1, [1,2,3]); // true

我建议您使用以下代码:

function inArray(needle, haystack) {
var length = haystack.length;
for (var i = 0; i < length; i++) {
if (haystack[i] == needle)
return true;
}
return false;
}