Google App脚本:加速/替代循环

时间:2017-11-01 22:29:54

标签: javascript arrays performance loops

我是Google App Scripts的新手。到现在为止还挺好。尝试做一些我以前在MsAccess DB中做的事情。我想我遇到了一些问题,这可能与我拥有的大量数据有关。为了说明我的问题:

我有两个数组:

**Array1**

ID || Name <br>
0001 || Peter<br>
0005 || Arthur<br>
0008 || Gloria<br>
0010 || Martin<br>
0014 || Jess <br>


**Array2**

ID || Age <br>
0001 || 23<br>
0002 || 18<br>
0005 || 24<br>
0010 || 7<br>

你可以想象,我希望产生类似的东西:

**Array3**

ID || Name || Age <br>
0001 || Peter || 23<br>
0005 || Arthur|| 24 <br>
0010 || Martin || 7<br>

我使用了我能想到的最简单的代码来加入&#39;:

for (var a=0; a<array1.length; a++) {
    for (var b=0; b<array2.length; b++) {
        if (array1[a][0] == array2[b][0]) {
            array3.push([array1[a][0],array1[a][1],array2[b][1]); break;
        }
    }
}

问题是:array1长度为70,000个条目,array2长度大约为10,000个条目,这意味着代码时间不足。

你们会做什么?

1 个答案:

答案 0 :(得分:1)

创建一个辅助对象,其属性名称是来自array2(或array1的id值;您可以尝试两者并查看哪个更快):

var a2map = {};
for (var a = 0; a < array2.length; a++)
  a2map[array2[a][0]] = array2[a];

现在您可以遍历array1寻找匹配项:

for (var a = 0; a < array1.length; a++)
  if (array1[a][0] in a2map)
    array3.push([ array1[a][0], array1[a][1], a2map[array1[a][0]][1] ]);

您的原始算法的运行时间大致与70000 * 20000成比例,这是一个很大的数字。这个将更接近90000左右,使其快几千倍。