Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript返回位置索引为;匹配的;数组中的数组_Javascript_Arrays - Fatal编程技术网

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)

在我看来,这只是一个子字符串搜索,但字符串的组成部分是数字而不是字符。因此,这可能是适用的,特别是当你的针头和草堆变大时。

可能想将此发布到。谢谢,刚刚发布了整个寻路代码:谢谢,不幸的是,它的速度要慢得多。:(我没有对此采取任何措施,但这是有道理的,因为有额外的操作。