Javascript 返回数组中“匹配”数组的位置索引
Javascript return position index of "matched" array within array
是否有另一种更快的方法来返回另一个数组中数组的一部分的位置/索引(其中多个值匹配)?在我的寻路算法中,它被称为很多,所以可以尽可能快地做。
我目前的函数是:
// 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(..;..;..)
循环替换了for(..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;
}
我已经更新了jsperf页面以包含此最新方法。
如果"大海捞针"没有排序,那么就没有办法让它更快。 不知道集合中的元素是如何排序的,本质上就是线性地从中找到一些东西,因为你只需要检查每件事。
如果你在同一个"haystack"上一遍又一遍地使用这个函数,你可以对集合进行排序,并使用排序来更快地找到"针"(查找不同的排序和搜索算法,以找到最适合你需求的算法,例如在haystack排序后使用二叉搜索来查找"针"。
它是否更快,但你可以做这样的事情:
[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数组的比较:compare-two-arrays-javascript-associative
干杯悠闲
使用 for(..;..;..)
循环而不是 for(..in..)
循环会产生最大的差异。
(请参阅问题末尾的编辑 3)
这只是一个子字符串搜索,但字符串的组成部分是数字而不是字符。因此,Boyer-Moore可能适用,特别是如果您的针头和大海捞针变大。
- 如何从某个位置顺时针和逆时针循环数组
- 将javascript数组中的项移动到特定位置的有效方法
- 生成ACF标记位置的数组(元素列表后缺少])
- 基于javascript中位置的数组差异
- Javascript删除数组中某个位置之后的项
- 在数组中迭代时的JS循环位置
- 在两个位置显示数组中的随机单词
- javascript递归,按数组位置查找子级
- 检查数组位置是否真的未定义
- 检查值存在于数组位置
- 在数组位置获取并设置cookie值
- 如何访问成员模板中的数组位置
- 递增数组位置
- 返回最低数字的数组位置(非负数)
- 我如何使一个按钮改变Javascript数组位置
- 我如何保存字符串的每个字母在不同的数组位置?并合并回单个字符串
- 下划线-比较两个对象数组(位置)
- for循环中的Ajax不会返回数组位置的正确值,尽管闭包绑定了当前值位置的范围
- 根据对象在Firebase中的数组位置检索对象
- 当使用x作为索引号时.要在函数中显示数组位置,数组返回undefined