优化块中API调用的邮政编码列表

时间:2017-06-11 18:48:33

标签: javascript arrays api optimization maps

我正在努力寻找一个优化问题的良好解决方案,这对我来说使用JavaScript以最佳方式解决起来非常困难。

我有一个数组开始,其中每个元素是另一个包含两个邮政编码的数组。我需要使用Google Maps距离矩阵API计算这些邮政编码之间的距离。 API限制我每次通话25个“起点”和25个“目的地”,这意味着我可以计算每次通话625个距离。由于我有大量的邮政编码列表,每天只有2500个API调用,而无需支付API使用费用,我需要尽可能优化这些调用(+我将本地距离保存为缓存)

在代码中,数组的示例如下所示:

[[10115, 99734],
[99734, 80331],
[80331, 10115],
[81929, 99734]]

没有重复,所以不必担心。最后,通过调用

maps.distanceMatrix({
   origins: orArray,
   destinations: destArray
}).asPromise()

我可以得到结果,但onArray和destArray每个只能包含25个邮政编码。我找不到具有良好运行时复杂性的良好解决方案,可以使用超过10000对邮政编码。

总之,我需要将第一个数组“转换”为多个源和目标数组,例如:到一个数组,其中每个元素再次由一个原始和目标数组组成,我只是循环并调用API。我希望我能够解决这个问题。如果你能给我一些关于如何以最有效的方式解决这个问题的想法会很棒,因为我已经坚持了很长时间了......

非常感谢!

1 个答案:

答案 0 :(得分:0)

我认为你可以将这些对存储在一个对象(哈希表)中进行优化:

var pairs=[[1,2],[1,3],[4,1]];

var hash={};

pairs.forEach(function(pair){
  if(hash[pair[0]]){
    return hash[pair[0]].push(pair[1]);
  }
  if(hash[pair[1]]){
   return hash[pair[1]].push(pair[0]);
  }
hash[pair[0]]=[pair[1]];
});

哈希现在应该是:

{
1:[2,3,4]
}

所以你可以:

for(key in hash)
 apiCall({origins:[key],destinations:hash[key]});

TODO:

{
1:[2,3,4],
5:[2,3,4]
}

可以优化为:

{origins:[1,5],destinations:[2,3,4]}