Javascript,合并每个1400项的两个对象,最快的方式?

时间:2016-09-06 22:30:32

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

对于像这样的结构

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次迭代,冻结了浏览器。

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

通过利用对象 - 代替数组特征,这需要更少的迭代次数

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)