我现在用来检查的功能如下:
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 中是两个不同的对象。
代码:
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
:
haystack.indexOf(needle) >= 0
如果您想支持旧的 Internet Explorer (< IE9),则必须包含您当前的代码作为解决方法。
除非您的列表已排序,否则您需要将每个值与指针进行比较。因此,您的解决方案和indexOf
都必须执行n/2
平均比较。然而,由于它indexOf
是一个内置方法,它可能会使用额外的优化,并且在实践中会稍微快一点。请注意,除非您的应用程序在列表中搜索非常频繁(例如每秒 1000 次)或列表很大(例如 100k 个条目),否则速度差异无关紧要。
我在 Google Chrome 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);
单行代码.. 将返回真或假
!!(arr.indexOf("val")+1)