You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何合并多次调用Google Distance Matrix API返回的结果数据

解决Google Distance Matrix API多调用结果合并问题

问题核心

你当前的代码要么会直接覆盖之前的API结果,要么会把完整的返回行对象塞进数组,没有实现合并两次返回的elements数组的需求。

修正方案

  1. 初始化结果对象为包含空elements数组的结构,而非空数组
  2. 每次API返回后,将返回数据里的elements数组合并到结果对象的elements中

修改后的完整代码

// 初始化正确的结果结构:包含空elements数组的对象
let distanceMatrixData = { elements: [] };
let countk = 0;
const totalRequests = destlatlongArr.length;

for(let k = 0; k < totalRequests; k++ ){
    Request.get(
      `${gmapBaseUrl}/distancematrix/json?origins=${custlatlong}&destinations=${destlatlongArr[k]}&key=${process.env.googleMapsKey}`,
      (error, response, body) => {
        if (error) {
          return res.status(500).json({
            success: 0,
            error: error,
            message: "Error in distance matrix Api",
          });
        }

        const responseRow = JSON.parse(body).rows[0];
        // 合并elements数组:两种方式任选其一
        // 方式1:用concat生成新数组
        distanceMatrixData.elements = distanceMatrixData.elements.concat(responseRow.elements);
        // 方式2:用push批量添加(性能更优)
        // distanceMatrixData.elements.push(...responseRow.elements);

        countk++;
        
        if(countk === totalRequests){
            console.log("合并后的结果:", distanceMatrixData);
            // 这里可以处理合并后的结果,比如返回给前端
            // res.status(200).json(distanceMatrixData);
        }
    });
}

原写法失效原因

  • 直接赋值distanceMatrixData = JSON.parse(body).rows[0]:每次都会覆盖之前的结果,最终仅保留最后一次API调用的行数据
  • 使用distanceMatrixData.push(...):因为初始化的是数组,push后得到的是[行对象1, 行对象2],而非将两个行对象内的elements合并为一个数组

进阶优化(可选)

回调式的异步处理用计数器判断完成状态,在请求顺序混乱或异常场景下不够优雅。可以改用Promise封装请求,再通过Promise.all批量处理:

// 封装单个API请求为Promise
function fetchDistanceMatrix(dest) {
  return new Promise((resolve, reject) => {
    Request.get(
      `${gmapBaseUrl}/distancematrix/json?origins=${custlatlong}&destinations=${dest}&key=${process.env.googleMapsKey}`,
      (error, response, body) => {
        if (error) return reject(error);
        const responseRow = JSON.parse(body).rows[0];
        resolve(responseRow.elements);
      }
    );
  });
}

// 批量发起请求并合并结果
Promise.all(destlatlongArr.map(dest => fetchDistanceMatrix(dest)))
  .then(allElements => {
    // 合并所有elements数组
    const mergedData = { elements: [].concat(...allElements) };
    console.log("合并后的结果:", mergedData);
    // res.status(200).json(mergedData);
  })
  .catch(error => {
    res.status(500).json({
      success: 0,
      error: error,
      message: "Error in distance matrix Api",
    });
  });

内容的提问来源于stack exchange,提问作者aasir khan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 12:45:35