Javascript 检查数组中是否存在元素

Javascript 检查数组中是否存在元素,javascript,arrays,Javascript,Arrays,我现在用来检查这一点的函数如下: function inArray(needle,haystack) { var count=haystack.length; for(var i=0;i<count;i++) { if(haystack[i]===needle){return true;} } return false; } 功能inArray(针、草垛) { var count=haystack.length; 对于(var i=

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

function inArray(needle,haystack)
{
    var count=haystack.length;
    for(var i=0;i<count;i++)
    {
        if(haystack[i]===needle){return true;}
    }
    return false;
}
功能inArray(针、草垛)
{
var count=haystack.length;
对于(var i=0;i只需使用:

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

代码:

function isInArray(value, array) {
  return array.indexOf(value) > -1;
}
isInArray(1, [1,2,3]); // true
function isInArray(value, array) {
  return array.indexOf(value) > -1;
}
isInArray(1, [1,2,3]); // true
执行:

function isInArray(value, array) {
  return array.indexOf(value) > -1;
}
isInArray(1, [1,2,3]); // true
function isInArray(value, array) {
  return array.indexOf(value) > -1;
}
isInArray(1, [1,2,3]); // true
更新(2017):

function isInArray(value, array) {
  return array.indexOf(value) > -1;
}
isInArray(1, [1,2,3]); // true
function isInArray(value, array) {
  return array.indexOf(value) > -1;
}
isInArray(1, [1,2,3]); // true
在遵循ECMAScript 2016(ES7)标准的现代浏览器中,您可以使用该功能,从而更容易检查数组中是否存在项:

const数组=[1,2,3];
常数值=1;
const isInArray=array.includes(值);
console.log(isInArray);//true
您可以使用underline.js库中的函数来实现这一点:

if (_.contains(haystack, needle)) {
  console.log("Needle found.");
};
在lodash中,您可以使用(它也可以作为ux.contains的别名)

您可以搜索整个阵列:

_.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)

自ECMAScript 6以来,可以使用Set:

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

ECMAScript 2016包含了一种专门解决该问题的数组方法,因此现在是首选方法

[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月,如果您需要支持较旧的浏览器,则几乎所有的主要浏览器都提供了此功能


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

我在Google Chrome 52上多次对其进行基准测试,但可以将其复制粘贴到任何其他浏览器的控制台中


~1500毫秒,包括(~2700毫秒,我使用时)
var数组=[0,1,2,3,4,5,6,7,8,9];
var结果=0;
var start=new Date().getTime();
对于(变量i=0;i<10000000;i++)
{
if(array.includes(“test”)==true){result++;}
}
log(new Date().getTime()-start);

约1050毫秒,indexOf
var数组=[0,1,2,3,4,5,6,7,8,9];
var结果=0;
var start=new Date().getTime();
对于(变量i=0;i<10000000;i++)
{
if(array.indexOf(“test”)>-1){result++;}
}
log(new Date().getTime()-start);

~650毫秒,自定义功能
函数数组(目标,数组)
{
/*缓存array.length不会提高V8上for循环的性能(可能在大多数其他主要引擎上)*/
对于(var i=0;i
您可以使用
indexOf
,但在internet explorer的最新版本中无法正常工作。 代码:

function isInArray(value, array) {
  return array.indexOf(value) > -1;
}
isInArray(1, [1,2,3]); // true
function isInArray(value, array) {
  return array.indexOf(value) > -1;
}
isInArray(1, [1,2,3]); // true
执行:

function isInArray(value, array) {
  return array.indexOf(value) > -1;
}
isInArray(1, [1,2,3]); // true
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;
}
功能inArray(针、草垛){
var length=haystack.length;
对于(变量i=0;i
在我看来很好。当然,如果你的数组被排序,你可以改为进行二进制搜索。或者如果数组中的每个值都是唯一的,你可以使用基于映射的方法来代替。
=
操作符?你真的想显式允许类型强制吗?当然不。因此,使用
=
操作符。它是sm在循环之前声明
count
的艺术。你也可以用
替换这两行(var i=haystack.length;i--;)
对于数字,你也可以使用
in
操作符(例如
(数组中的5)
。它可能比其他选项更快,但不适用于字符串、对象或任何其他非数字。
Array.prototype.indexOf
在IE8中未实现。IE中不支持(可能仅在9中)这在页面上有所说明,但作为答案的一部分,值得一提:
indexOf
是JavaScript的一个相对较新的补充,在9.0之前的IE版本中不受支持。同样值得一提的是,
indexOf
仍然是O(n),因此如果OP的意思是“更好”就速度/性能而言,这并不是更好,只是更短。@Tomalak Geret'kal True,尽管论点很简单。添加了一段关于性能的内容,以防性能是OP对
better
@Francisc的意思-然后你可以尝试基于地图的方法。然后你的
inaray()
实现可以简单到
return haystack[pinder]!=undefined;
!=-1[extra chars]
indexOf
在IE浏览器中工作不认真。@totaldesign工作不认真,你是说它在IE中工作不认真吗?:据我所知,在节点4.4.7中,ES2016(包括数组的include方法)是ECMAScript的第七版。6.版是ES 2015,不包含“包含”。请更正。下划线库仅用于此?不一定,因为开发人员可能已经在其应用程序中使用下划线用于其他功能。使用下划线是众多解决方案中的一种。