Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/468.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/13.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_Iteration_Performance Testing - Fatal编程技术网

多数组迭代javascript

多数组迭代javascript,javascript,arrays,iteration,performance-testing,Javascript,Arrays,Iteration,Performance Testing,在迭代两个不同的数组时,我有一个严格基于性能的问题 我的第一个数组由以下方式组成,对象由{id,number}组成 var arr1 = [{id: 1, number: 7}, {id: 2, number: 5}]; 我的第二个数组由相同的id字段和一个字符串值组成 var arr2 = [{id: 2, string: 'foo'}, {id: 1, string: 'bar'}]; 我的问题是,我需要将第一个数组中的id与第二个数组中的id按照该顺序进行匹配。我用以下方式编写代码 a

在迭代两个不同的数组时,我有一个严格基于性能的问题


我的第一个数组由以下方式组成,对象由{id,number}组成

var arr1 = [{id: 1, number: 7}, {id: 2, number: 5}];

我的第二个数组由相同的id字段和一个字符串值组成

var arr2 = [{id: 2, string: 'foo'}, {id: 1, string: 'bar'}];

我的问题是,我需要将第一个数组中的id与第二个数组中的id按照该顺序进行匹配。我用以下方式编写代码

arr1.forEach(function(x){
   arr2.forEach(function(y){
      if(condition){
         Do something...
      }
   });
});

有没有一种更快/更有效的方法可以在没有两个forEach循环的情况下遍历数组?或者,该配置是比较所有值的最佳方法


我写的代码可以正常工作并且返回没有问题,但是我不禁想到这里有一种更快的(性能方面的)方法或方法来做同样的事情


感谢您对此的所有见解

很好地使用本机
for..loop
将更快地产生相同的结果,因为
forEach
方法与数组的实现完全相同。如果你更喜欢速度而不是表现力,那么就选择
for..loop


看看这个

事实上,您的代码运行在
O(n^2)
复杂度中


您可以做的是:

  • 使用
    mergesort对
    arr1
    arr2
    进行排序
  • 然后通过相同的索引逐个进行比较

  • 在这种方法中,您将得到
    O(n*logn+n*logn+n)
    ,结果是
    O(n*logn)

    既然id属性应该是唯一的,为什么不利用本机javascript对象呢

    var objects1 =  {
        id_1: {number: 7},
        id_2: {number: 5}
    };
    
    var objects2 = {
        id_2: {string: 'foo'},
        id_1: {string: 'bar'}
    };
    
    console.log(objects1.id_1.number + ' | ' + objects2.id_1.string);
    

    我认为这是实现这一点的最快方法。

    我建议您在遇到性能问题之前不要在意这一点


    如果性能问题与您的情况相同:

  • 使用此测试套件验证目标浏览器中不同方法的性能
  • 使用最佳方法

  • 注释

    • 未经编辑的测试套件使用10000个项目执行
    • 有些方法可以分为准备和应用两部分,因此,如果您需要将“静态”数组多次合并到其他数组中,那么性能增益将非常大
    • 开放式开发工具的性能通常较小(小得多)

    ==更新==


    测试结果:

    • Chrome在“将一个数组转换为对象”方法中提供了更好的性能
    • Edge在“对两个数组进行排序”方法中提供了更好的性能
    • mac上的Safari在“将一个数组转换为对象”和“对两个数组进行排序”两种方法中的性能几乎相同(chrome&edge中的赢家)

    如果您更喜欢语法,可以使用循环,但是
    。forEach
    是一个同步函数,是在数组中完全循环的最快方法。另外,
    .forEach
    不能是
    break
    d,因此如果需要,使用
    for…of
    可以在某些条件成功后停止迭代


    如果您试图从数组中查找一组特定的项,您可能需要使用
    .filter
    .map
    .find
    。一些
    。每个

    id
    对于每个数组都是唯一的吗?id是否按升序排列?如果是,则获取arr1的id和访问arr2的准确位置,而不使用循环,这是
    id
    排序在
    arr1
    ?可能重复-这是一个主要基于意见的问题,因为您将根据经验等获得许多意见。因此,这个问题应该结束。