Javascript返回位置索引为;匹配的;数组中的数组
是否有另一种更快的方法返回另一个数组(多个值匹配)中数组部分的位置/索引?在我的寻路算法中,它被称为很多东西,因此需要尽可能快的速度 我目前的职能是:Javascript返回位置索引为;匹配的;数组中的数组,javascript,arrays,Javascript,Arrays,是否有另一种更快的方法返回另一个数组(多个值匹配)中数组部分的位置/索引?在我的寻路算法中,它被称为很多东西,因此需要尽可能快的速度 我目前的职能是: // 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 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种描述的方法进行了基准测试(初始方法最快):
编辑3:
刚刚将(…in.)的循环替换为(…;in.;…)
循环(因为我知道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;
}
函数坐标\u数组中的位置\u(针、草垛){
对于(var n=0;n如果“干草堆”没有排序,那么就没有办法使它更快。不知道集合中的元素是如何排序的,这就使得从集合中找出一些本质上是线性的,因为你只需要检查每一件事
如果您在同一个“干草堆”上反复使用此功能,则可以对集合进行排序,并使用排序使其更快地找到“针”(查找不同的排序和搜索算法,以找到最适合您需要的算法,例如在干草堆排序后使用二进制搜索查找“针”)我不知道它是否更快,但你可以这样做:
[1,2,3,4].slice(0,2).toString() == [1,2].toString()
在您的情况下,它将是:
function coordinate_location_in_array(needle,haystack){
for(n in haystack){
if(haystack[n].slice(0,2).toString() == needle.toString()) return n
}
return false;
}
还发现了这篇文章,其中介绍了JS阵列的比较:
干杯
回退使用for(…;;…)
循环而不是for(…in.)
循环产生了最大的差异
(见问题末尾的编辑3)在我看来,这只是一个子字符串搜索,但字符串的组成部分是数字而不是字符。因此,这可能是适用的,特别是当你的针头和草堆变大时。可能想将此发布到。谢谢,刚刚发布了整个寻路代码:谢谢,不幸的是,它的速度要慢得多。:(我没有对此采取任何措施,但这是有道理的,因为有额外的操作。