別の配列 (複数の値が一致する場合) 内の配列の一部の位置/インデックスを返す代替のより高速な方法はありますか? 私の経路探索アルゴリズム内で頻繁に呼び出されるため、できるだけ高速にすることができます。
私の現在の機能は次のとおりです。
// 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番目の方法でパフォーマンスが向上する可能性がありますか?
編集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 ページを更新しました。