关于javascript:检查数组中是否存在元素

Check if an element is present in an array

本问题已经有最佳答案,请猛点这里访问。

我现在使用的功能是检查以下内容:

1
2
3
4
5
6
7
8
9
function inArray(needle,haystack)
{
    var count=haystack.length;
    for(var i=0;i<count;i++)
    {
        if(haystack[i]===needle){return true;}
    }
    return false;
}

它起作用了。我要找的是是否有更好的方法。


ECMAScript 2016年incorporates安includes()翼的方法,特别是解决问题,所以现在是首选的方法。 </P >

1
2
3
[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)

As of 2018年七月,这已被implemented几乎全在大browsers,如果你需要一个支持IE polyfill是可用的。 </P >


代码: </P >

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

执行: </P >

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

更新(2017年): </P >

在现代browsers这遵循ECMAScript(ES7在2016年)的标准,你可以使用函数array.prototype.includes,这让它更easier通到检查如果一个item is present在西安阵列: </P >

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

</P >


是的indexOf使用: </P >

1
haystack.indexOf(needle) >= 0

如果你想支持在互联网explorers(<IE9的),你将不得不包含你的代码流作为一种workaround虽然。。。。。。。 </P >

除非你的清单是sorted,你需要对每一个compare值的针。因此,你的indexOf两液和将要n/2execute方法是一般的。然而,由于indexOf是一个嵌入式的方法,它可以使用额外的优化和将在稍长的更快的做法。注意,除非你的应用程序的列表中的searches甚常常准备说A 1000时代每秒)或"列表"(说的是来自一个遥远的100k条目),高速差分将不会物。 </P >


我benchmarked它多的时代,是谷歌的铬52,但感觉很自由的copypaste它为任何其他浏览器的控制台。 </P > ~1500多发性硬化,包括(~2700多发性硬化,当我过去的polyfill)

1
2
3
4
5
6
7
8
9
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~,指标的数量关系

1
2
3
4
5
6
7
8
9
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多发性硬化,自定义函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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);


单行代码…………………将返回true或false </P >

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


你可以使用indexOf但不好的工作在最后的版本的Internet Explorer。 代码: </P >

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

执行: </P >

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

我suggest你使用下面的代码: </P >

1
2
3
4
5
6
7
8
function inArray(needle, haystack) {
 var length = haystack.length;
 for (var i = 0; i < length; i++) {
 if (haystack[i] == needle)
  return true;
 }
 return false;
}


你可以使用_ contains函数从underscore.js:这个库的实现 </P >

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


由于ecmascript6,一个可以使用的设置: </P >

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

depending是大小的针,你要找的Array.filter的可能是有用的。这里的一个实例: </P >

1
2
3
4
5
let filtered, arr = ['Haystack', 'Needle'];
filtered = arr.filter((elem) => {
  return elem.toLowerCase() === 'needle';
});
// filtered => ['needle']

在lodash你可以使用_ .includes(这也aliases到_ .contains) </P >

你可以搜索在整个阵列: </P >

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

你可以搜索数组从一个初始指标: </P >

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

搜索一个字符串: </P >

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

工厂检查方法也简单翼的研究对象: </P >

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

一件事情的注意,关于最后的案例是真实的厂用primitives状的字符串,数字和布尔值,但不能一翼或对象的搜索 </P >

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