我应该使用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"); }
如果你只想在数组中找到一个字符串,我相信这可能是最好的做法。