【问题标题】:Javascript, merging two objects of 1400 items each, fastest way?Javascript,合并两个对象,每个对象 1400 项,最快的方式?
【发布时间】:2016-09-06 22:30:32
【问题描述】:

对于这样的结构

var arr = [];
arr[0] = {};
arr[0].p1 = [];
arr[0].p1[0] = 'hola arr0 p1';
arr[0].p2 = [];
arr[0].p2[0] = 'hola arr0 p2';
arr[1] = {};
arr[1].p1 = [];
arr[1].p1[0] = 'hola arr1 p1';
arr[1].p2 = [];
arr[1].p2[0] = 'hola arr1 p2';
arr[2] = {};
arr[2].p1 = [];
arr[2].p1[0] = 'hola arr2 p1';
arr[2].p3 = [];
arr[2].p3[0] = 'hola arr2 p3';
arr[3] = {};
arr[3].p2 = [];
arr[3].p2[0] = 'hola arr3 p2';
arr[3].p3 = [];
arr[3].p3[0] = 'hola arr3 p3';
arr[4] = {};
arr[4].p1 = [];
arr[4].p1[0] = 'hola arr4 p1';
arr[4].p4 = [];
arr[4].p4[0] = 'hola arr4 p4';

我想合并对象,以便最后将所有信息浓缩在一个对象中。 此代码有效:

for (let a=1;a<arr.length; a++){
    for (let i in arr[0]) {
        for (let j in arr[a]) {
        if (i === j) {
        arr[0][i][a] = arr[a][j][0];
        delete arr[a][j];
      }
        }
    }

    for (let j in arr[a]) {
        arr[0][j] = [];
        arr[0][j][a] = arr[a][j][0];
    delete arr[a][j];
    }

}

console.log(arr)

我得到了我想要的输出。

https://jsfiddle.net/jb73tur4/

问题是在我的真实代码中 arr[0] 有 1500 个键,而 arr[1] 有 1300 个键。循环遍历这两个意味着 1500x1300 次迭代,这会冻结浏览器。

有没有办法做到这一点?以某种方式加速?

【问题讨论】:

    标签: arrays performance loops for-loop javascript-objects


    【解决方案1】:

    如果您预计会有这么多迭代,请查看 Web Worker API (https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Using_web_workers),它允许您在后台运行计算并防止页面冻结。

    【讨论】:

    • 但这是个好主意吗?这个尺寸与javascript兼容吗?
    【解决方案2】:

    通过利用对象而不是数组的特性,这需要更少的迭代

    https://jsfiddle.net/jb73tur4/2/

    for (var a = 1; a < arr.length; a++) {
      for (let p in arr[a]) {
        if (arr[0][p]) {
          arr[0][p][a] = arr[a][p][0];
          delete arr[a][p];
        }
      }
    
      let new_str = {};
      for (let p in arr[a]) {
        new_str[p] = [];
        new_str[p][a] = arr[a][p][0];
      }
      Object.assign(arr[0], new_str);
      delete arr[a];
    }
    
    console.log(arr)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-14
      • 2019-12-02
      • 1970-01-01
      相关资源
      最近更新 更多