检查数组中是否存在元素

时间:2011-09-11 12:39:32

标签: 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;
}

有效。我正在寻找的是是否有更好的方法。

10 个答案:

答案 0 :(得分:770)

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月起,几乎所有主要浏览器中的此has been implemented,如果您需要支持IE,polyfill可用。 < / p>

答案 1 :(得分:394)

<强>代码:

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

答案 2 :(得分:72)

只需使用indexOf

haystack.indexOf(needle) >= 0

如果您想支持旧的Internet Explorer(&lt; IE9),则必须include your current code as a workaround though

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

答案 3 :(得分:26)

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

~1500 ms,包括(当我使用polyfill时<~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);

答案 4 :(得分:20)

单行代码..将返回true或false

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

答案 5 :(得分:15)

您可以使用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;
}

答案 6 :(得分:8)

您可以使用underscore.js库中的_contains函数来实现此目的:

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

答案 7 :(得分:4)

从ECMAScript6开始,可以使用Set:

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

答案 8 :(得分:2)

根据针的大小,您查找Array.filter可能会有用。这是一个例子:

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

答案 9 :(得分:0)

在lodash中你可以使用_.includes(也是_.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