我应该使用jQuery.inArray()吗?

我在对象数组中进行非常频繁的搜索,并且一直在使用jQuery.inArray()。 但是,我有速度和内存问题,根据我的探查器,最常用的方法之一是jQuery.inArray()。 大街上的表现是什么? 我应该切换到简单的for循环吗?

我的具体function是:

function findPoint(point, list) { var l = list.map(function anonMapToId(p) { return p.id }); var found = jQuery.inArray(point.id, l); return found; } 

可能是list.map()list.map()责备吗?

好吧内部inArray做了一个简单的循环,我建议你检查一下是否有一个原Array.prototype.indexOf实现,并使用它代替inArray如果可用):

 function findPoint(point, list) { var l = list.map(function anonMapToId(p) { return p.id }); var found = ('indexOf' in Array.prototype) ? l.indexOf(point.id) : jQuery.inArray(point.id, l); return found; } 

Array.prototype.indexOf方法已经在实现JavaScript 1.6的浏览器中引入,它将成为ECMAScript 5标准的一部分。

本机实现比非本机实现快。

你真正想要的是一个Array.prototype.filter

 function findPoint(point, list) { return list.filter(function anonFilterToId(p) { return p.id === point.id; }).length > 0; } 

即使inArray函数很慢,你仍然在为每次搜索创建一个全新的数组。 我认为重新设计此搜索会更好,例如找到点之前创建id-list,然后使用该列表搜索:

我正在做一个数组的连接,把它变成一个字符串,并避免像这样的循环部分:

 var strList = ","+array.join(",")+","; return strList.indexOf(","+search+",") !== -1 ? true : false; 

如果数组是巨大的,它可能会受到伤害,但对于一个小的列表,它比循环解决方案快得多

PS我正在添加一个结束昏迷以避免看起来像

当我想知道我的数组中是否有一个字符串时,我总是使用lastIndexOf 。 所以,它是这样的:

 var str = 'a'; var arr = ['a','b','c']; if( arr.lastIndexOf(str) > -1){ alert("String " + str + " was found in array set"); } else { alert("String " + str + " was not found"); } 

如果你只想在数组中找到一个字符串,我相信这可能是最好的做法。