Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/428.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/0/search/2.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_Search_Multidimensional Array - Fatal编程技术网

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比较。我想这取决于数组是否可以包含重复的值。