Javascript有效地获取二维数组中值的行号
在二维数组中返回值的行号最有效的方法是什么?例如,我可以做以下工作。我可以用映射和/或过滤器代替迭代吗Javascript有效地获取二维数组中值的行号,javascript,search,multidimensional-array,Javascript,Search,Multidimensional Array,在二维数组中返回值的行号最有效的方法是什么?例如,我可以做以下工作。我可以用映射和/或过滤器代替迭代吗 function getRow(array2d = [['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h', 'i']], value = 'g') { for (let i = 0; i < array2d.length; i++) { if (array2d[i].indexOf(value) > -1) { retur
function getRow(array2d = [['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h', 'i']], value = 'g') {
for (let i = 0; i < array2d.length; i++) {
if (array2d[i].indexOf(value) > -1) {
return i;
}
}
return -1;
}
函数getRow(array2d=['a','b','c'],['d','e','f'],['g','h','i']],值='g'){
for(设i=0;i-1){
返回i;
}
}
返回-1;
}
您可以这样使用:
函数getRow(array2d=['a','b','c'],['d','e','f'],['g','h','i']],值='g'){
for(设i=0;i-1){
返回i;
}
}
返回-1;
}
const now=performance.now();
log(getRow());
log(performance.now()-now)代码>您可以这样使用:
函数getRow(array2d=['a','b','c'],['d','e','f'],['g','h','i']],值='g'){
for(设i=0;i-1){
返回i;
}
}
返回-1;
}
const now=performance.now();
log(getRow());
log(performance.now()-now)
在这里发布带有回调的findIndex
的示例比循环的慢
结果对我来说:
for loop=11.020000092685223
更快
带回调的findIndex=12.69999692933362
较慢
故事的士气,如果表现是至关重要的,总是测试。浏览器有一些非常聪明/复杂的优化。例如,@GuerricP发布的基准只进行了简单的属性比较,V8引擎可能会检测到这一点。在里面放一个更复杂的includes
,这是另一个故事
这也是出于上述原因,您永远不应该预先优化JS,只有在您认为有性能问题需要解决时才进行优化
同样使问题复杂化的是,不同的浏览器/操作系统可能会给出不同的结果。我的测试在Linux/Chrome上进行
函数getRow(array2d=['a','b','c'],['d','e','f'],['g','h','i']],值='g'){
for(设i=0;i-1)返回i;
返回-1;
}
const now=performance.now();
对于(设l=0;l<1000000;l+=1)
getRow();
log(performance.now()-now)
在这里发布带有回调的findIndex
的示例比循环的慢
结果对我来说:
for loop=11.020000092685223
更快
带回调的findIndex=12.69999692933362
较慢
故事的士气,如果表现是至关重要的,总是测试。浏览器有一些非常聪明/复杂的优化。例如,@GuerricP发布的基准只进行了简单的属性比较,V8引擎可能会检测到这一点。在里面放一个更复杂的includes
,这是另一个故事
这也是出于上述原因,您永远不应该预先优化JS,只有在您认为有性能问题需要解决时才进行优化
同样使问题复杂化的是,不同的浏览器/操作系统可能会给出不同的结果。我的测试在Linux/Chrome上进行
函数getRow(array2d=['a','b','c'],['d','e','f'],['g','h','i']],值='g'){
for(设i=0;i-1)返回i;
返回-1;
}
const now=performance.now();
对于(设l=0;l<1000000;l+=1)
getRow();
log(performance.now()-now)代码>使用节点,可以将数组划分为多个
子数组并使用async并行运行搜索:
下面的脚本使用两个线程,将为您提供一半的时间
异步函数aGetRow(d,v){
让一半=数学地板(d.长度/2);
让剩余=d.长度-一半
让r=等待承诺([
getRow(d.切片(0,一半),v),
getRow(d.切片(一半,剩余),v),
]);
如果(r[0]!=-1){
返回r[0];
}
如果(r[1]!=-1){
返回r[1];
}
返回-1;
}
必须注意,默认情况下,NodeJS在线程池中有4个线程。如果拆分的阵列多于线程,则无法获得性能增强
编辑:对于对NodeJS线程和事件循环的细节感兴趣的人,我强烈推荐这段视频:对于节点,您可以将阵列分成多个部分
子数组并使用async并行运行搜索:
下面的脚本使用两个线程,将为您提供一半的时间
异步函数aGetRow(d,v){
让一半=数学地板(d.长度/2);
让剩余=d.长度-一半
让r=等待承诺([
getRow(d.切片(0,一半),v),
getRow(d.切片(一半,剩余),v),
]);
如果(r[0]!=-1){
返回r[0];
}
如果(r[1]!=-1){
返回r[1];
}
返回-1;
}
必须注意,默认情况下,NodeJS在线程池中有4个线程。如果拆分的阵列多于线程,则无法获得性能增强
编辑:对于那些对NodeJS线程和事件循环细节感兴趣的人,我强烈推荐这段视频:你做得怎么样,使用map/filter甚至可能会因为回调开销而降低效率。您可以将indexOf
更改为includes(value)
,这可能会快一点,因为它不需要进行-1比较。我想这取决于数组是否可以包含重复的值。如果没有,请逐个检查每个值。否则,您可以先使用Set来消除噪声。如何做到这一点,使用map/filter甚至可能由于回调开销而降低效率。您可以将indexOf
更改为includes(value)
,这可能会快一点,因为它不需要进行-1比较。我想这取决于数组是否可以包含重复的值。