如何合并多次调用Google Distance Matrix API返回的结果数据
解决Google Distance Matrix API多调用结果合并问题
问题核心
你当前的代码要么会直接覆盖之前的API结果,要么会把完整的返回行对象塞进数组,没有实现合并两次返回的elements数组的需求。
修正方案
- 初始化结果对象为包含空
elements数组的结构,而非空数组 - 每次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
相关产品推荐
相关产品推荐

