是否有另一种更快的方法来返回另一个数组中的部分数组的位置/索引(多个值匹配)?它在我的寻路算法中被调用了很多,因此可以尽可能快地完成。
我目前的功能是:
// Haystack can be e.g. [[0,1,278.9],[4,4,22.1212]]
function coordinate_location_in_array(needle,haystack){
for(n in haystack){
if(haystack[n][0]==needle[0] && haystack[n][1]==needle[1]) return n;
}
return false;
}
// Needle of [0,1]: returns 0
// Needle of [4,4]: returns 1
// Needle of [6,7]: returns false
编辑:
我一直在搞砸,想出了一个(相当可怕的)基于字符串操作的方法(从而避免了代价高昂的for
循环)。我认为它仍然稍微慢一些。有人可以对这些方法进行基准测试吗?
function coordinate_location_in_array(needle,haystack) {
var str1 = ':' + haystack.join(':');
var str2 = str1.replace(':'+needle[0]+','+needle[1],'*').split('*')[0];
if(str2.length == str1.length) return false;
var preceedingElements = str2.match(/:/g);
return preceedingElements!=null?preceedingElements.length:0;
}
也许通过一些改进,第二种方法可能会提供一些性能提升?
编辑2:
Bench 使用 jsperf.com 标记了所有 3 种描述的方法(初始方法最快):http: //jsperf.com/finding-matched-array-within-array/3
编辑3:
刚刚用for(..in..)
循环替换了for(..;..;..)
循环(因为我知道haystack
数组永远不会有“间隙”),性能似乎有了显着提高:
function coordinate_location_in_array(needle,haystack){
for(var n=0;n<haystack.length;n++){
if(haystack[n][0]==needle[0] && haystack[n][1]==needle[1]) return n;
}
return false;
}
我已经更新了 jsperf 页面以包含这个最新的方法。