我现在正在使用的函数来检查这个问题如下:
function inArray(needle,haystack)
{
var count=haystack.length;
for(var i=0;i<count;i++)
{
if(haystack[i]===needle){return true;}
}
return false;
}
它有效。有更好的方法吗?
我现在正在使用的函数来检查这个问题如下:
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包含了一个数组方法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月,这个已经在几乎所有主要的浏览器中实现了,如果你需要支持旧的浏览器,可以使用polyfill。
编辑:请注意,如果数组中的项是对象,则此函数将返回false。这是因为在JavaScript中,相似的对象是两个不同的对象。
if ("includes" in Array.prototype)
是否存在,如果不存在,则实现它(例如使用 Benny 的答案 中的解决方案)。MDN 文档(也包含在此答案中的链接中)实际上已经为你提供了一个 polyfill。 - FireSBurnsmuPmyArray.indexOf(myVal) > -1
是同样的事情,但更安全。 - vinsa代码:
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
indexOf
在 IE 浏览器中运行时存在问题。 - user2598812Array.prototype.indexOf
在 IE8 中未被实现。 - Šime VidasindexOf
是JavaScript的一个相对较新的特性,在IE 9.0之前的版本中不受支持。另外值得注意的是,indexOf
仍然具有O(n)的时间复杂度,所以如果OP在速度/性能方面更希望有所改善,这并不能真正做到,只是代码更短而已。 - arothinArray()
实现可能会非常简单,只需要return haystack[needle] != undefined;
即可。 - aroth我在谷歌浏览器52版本上进行了多次基准测试,但随意将其复制粘贴到任何其他浏览器的控制台中。
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);
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);
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);
some
,正如我所预期的,如果 (array.some(i => i>2)),速度会快两倍。结果会增加一次。大约需要50-90毫秒。 - undefined一行代码...会返回true或false
!!(arr.indexOf("val")+1)
!!~arr.indexOf("val")
。该代码的含义是查找数组 arr
中是否包含值为 "val"
的元素,如果包含则返回 true
,否则返回 false
。 - Samie Bencherif~arr.indexOf("val")
。0 = 假值,其他数字 = 真值 - Viliami您可以使用 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;
}
自ECMAScript6起,可以使用Set:
var myArray = ['A', 'B', 'C'];
var mySet = new Set(myArray);
var hasB = mySet.has('B'); // true
var hasZ = mySet.has('Z'); // false
你可以使用_contains函数从underscore.js库中实现这个功能:
if (_.contains(haystack, needle)) {
console.log("Needle found.");
};
_.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
count
是明智的选择。你也可以用for(var i=haystack.length; i--;)
替换那两行代码。 - Greg Perhamin
运算符(例如(5 in array)
)。它可能比其他选项更快,但不适用于字符串、对象或任何其他非数字。 - Yuval A.