检查数组中是否存在元素[重复]

我现在用来检查此功能的函数如下:

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

有用。我正在寻找的是是否有更好的方法来做到这一点。

Sam蛋蛋Itachi2020/03/12 15:33:03

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

if (_.contains(haystack, needle)) {
  console.log("Needle found.");
};
小胖Eva2020/03/12 15:33:03

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

!!(arr.indexOf("val")+1)
Chloe2020/03/12 15:33:03

只需使用indexOf

haystack.indexOf(needle) >= 0

如果要支持旧的Internet Explorer(<IE9),则必须包括当前代码作为解决方法

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

村村蛋蛋2020/03/12 15:33:03

您可以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;
}
GO番长2020/03/12 15:33:03

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月开始,如果您需要支持IE,则可以在polyfill中使用几乎所有主流浏览器

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

SamEva2020/03/12 15:33:03

码:

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