我在对象数组中进行非常频繁的搜索,并且一直在使用jQuery.inArray()。但是,我有速度和内存问题,根据我的探查器,最常调用的方法之一是jQuery.inArray()。街上有什么关于它的表现的话?我应该切换到简单的for循环吗?
我的具体功能是:
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()
更值得责备吗?
答案 0 :(得分:15)
内部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;
}
在实现JavaScript 1.6的浏览器中引入了Array.prototype.indexOf
方法,它将成为ECMAScript 5标准的一部分。
本机实现方式比非本机实现更快。
答案 1 :(得分:3)
你真正想要的是Array.prototype.filter
。
function findPoint(point, list)
{
return list.filter(function anonFilterToId(p) {
return p.id === point.id;
}).length > 0;
}
答案 2 :(得分:2)
即使inArray
函数速度很慢,您仍然会为每次搜索创建一个全新的数组。我认为通过例如重新设计此搜索会更好。在找到点之前创建id-list ,并使用该点搜索:
答案 3 :(得分:2)
我正在对数组进行连接以将其转换为字符串并避免像这样的循环部分:
var strList = ","+array.join(",")+",";
return strList.indexOf(","+search+",") !== -1 ? true : false;
如果阵列很大,它会受到伤害,但对于一个小列表,它比循环解决方案快得多
PS我正在添加一个结束昏迷以避免看起来像
答案 4 :(得分:1)
当我想知道我的数组中是否有字符串时,我总是使用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");
}
如果你只是想在数组中找到一个字符串,我相信这可能是最好的做法。