是否有另一種更快的方法返回另一個數組中某個數組的部分位置/索引(其中多個值匹配)?這在我的尋路算法中被稱爲很多,因此可以儘可能快地完成。數組中「匹配」數組的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