是否有另一种更快的方法返回另一个数组中某个数组的部分位置/索引(其中多个值匹配)?这在我的寻路算法中被称为很多,因此可以尽可能快地完成。数组中“匹配”数组的Javascript返回位置索引
我目前的功能是:
// 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:
工作台标记使用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页面以包含此最新方法。
可能要发布到http://codereview.stackexchange.com/。 – j08691
谢谢,刚刚发布了整个寻路代码:http://codereview.stackexchange.com/questions/13258/javascript-a-pathfinding-function-for-tile-based-game-optimisation – Alex