如何用Node.js从指定API获取指定port_id的actual_delay数据?
提取指定port_id对应的actual_delay值
我尝试用Node.js从某API提取数据,API返回的JSON结构如下:
{"wait_time": {"port": [{"port_id": "240201","wait_time_event": {"update_time": "2024-08-20T15:40:00","lane": [{"type": "Commercial","sub_type": "Aduana","actual_delay": "31","expected_delay": "31"},{"type": "Commercial","sub_type": "CBP FAST","actual_delay": "5","expected_delay": "6"},{"type": "Commercial","sub_type": "CBP Standard","actual_delay": "7","expected_delay": "8"},{"type": "Commercial","sub_type": "DPS FAST","actual_delay": "7","expected_delay": "6"},{"type": "Commercial","sub_type": "DPS Standard","actual_delay": "7","expected_delay": "7"}]}},{"port_id": "535502","wait_time_event": {"update_time": "2024-08-20T15:40:00","lane": [{"type": "Commercial","sub_type": "Aduana","actual_delay": "5","expected_delay": "5"},{"type": "Commercial","sub_type": "CBP FAST","actual_delay": "13","expected_delay": "13"},{"type": "Commercial","sub_type": "CBP Standard","actual_delay": "74","expected_delay": "68"},{"type": "Commercial","sub_type": "DPS FAST","actual_delay": "5","expected_delay": "5"},{"type": "Commercial","sub_type": "DPS Standard","actual_delay": "4","expected_delay": "5"}]}},{"port_id": "230403","wait_time_event": {"update_time": "2024-08-20T15:40:00","lane": [{"type": "Commercial","sub_type": "Aduana","actual_delay": "8","expected_delay": "7"},{"type": "Commercial","sub_type": "CBP FAST","actual_delay": "5","expected_delay": "5"},{"type": "Commercial","sub_type": "CBP Standard","actual_delay": "21","expected_delay": "20"},{"type": "Commercial","sub_type": "DPS FAST","actual_delay": "4","expected_delay": "4"},{"type": "Commercial","sub_type": "DPS Standard","actual_delay": "4","expected_delay": "4"}]}},{"port_id": "230302","wait_time_event": {"update_time": "2024-08-20T15:40:00","lane": [{"type": "Commercial","sub_type": "Aduana","actual_delay": "1","expected_delay": "1"},{"type": "Commercial","sub_type": "CBP FAST","actual_delay": "1","expected_delay": "1"},{"type": "Commercial","sub_type": "CBP Standard","actual_delay": "5","expected_delay": "5"},{"type": "Commercial","sub_type": "DPS FAST","actual_delay": "2","expected_delay": "2"},{"type": "Commercial","sub_type": "DPS Standard","actual_delay": "4","expected_delay": "4"}]}},{"port_id": "250602","wait_time_event": {"update_time": "2024-08-20T15:30:00","lane": [{"type": "Commercial","sub_type": "Aduana","actual_delay": "0","expected_delay": "0"},{"type": "Commercial","sub_type": "CBP FAST","actual_delay": "8","expected_delay": "9"},{"type": "Commercial","sub_type": "CBP Standard","actual_delay": "11","expected_delay": "12"},{"type": "Commercial","sub_type": "DPS FAST","actual_delay": "0","expected_delay": "0"},{"type": "Commercial","sub_type": "DPS Standard","actual_delay": "0","expected_delay": "0"}]}},{"port_id": "230502","wait_time_event": {"update_time": "2024-08-20T15:40:00","lane": [{"type": "Commercial","sub_type": "Aduana","actual_delay": "3","expected_delay": "3"},{"type": "Commercial","sub_type": "CBP FAST","actual_delay": "8","expected_delay": "8"},{"type": "Commercial","sub_type": "CBP Standard","actual_delay": "8","expected_delay": "8"},{"type": "Commercial","sub_type": "DPS FAST","actual_delay": "12","expected_delay": "11"},{"type": "Commercial","sub_type": "DPS Standard","actual_delay": "20","expected_delay": "19"}]}},{"port_id": "230404","wait_time_event": {"update_time": "2024-08-20T15:40:00","lane": [{"type": "Commercial","sub_type": "Aduana","actual_delay": "65","expected_delay": "55"},{"type": "Commercial","sub_type": "CBP FAST","actual_delay": "12","expected_delay": "21"},{"type": "Commercial","sub_type": "CBP Standard","actual_delay": "17","expected_delay": "18"},{"type": "Commercial","sub_type": "DPS FAST","actual_delay": "0","expected_delay": "0"},{"type": "Commercial","sub_type": "DPS Standard","actual_delay": "30","expected_delay": "24"}]}},{"port_id": "240203","wait_time_event": {"update_time": "2024-08-20T15:40:00","lane": [{"type": "Commercial","sub_type": "Aduana","actual_delay": "11","expected_delay": "14"},{"type": "Commercial","sub_type": "CBP FAST","actual_delay": "19","expected_delay": "12"},{"type": "Commercial","sub_type": "CBP Standard","actual_delay": "26","expected_delay": "26"},{"type": "Commercial","sub_type": "DPS FAST","actual_delay": "14","expected_delay": "18"},{"type": "Commercial","sub_type": "DPS Standard","actual_delay": "7","expected_delay": "6"}]}},{"port_id": "535503","wait_time_event": {"update_time": "2024-08-20T15:40:00","lane": [{"type": "Commercial","sub_type": "Aduana","actual_delay": "12","expected_delay": "8"},{"type": "Commercial","sub_type": "CBP FAST","actual_delay": "10","expected_delay": "10"},{"type": "Commercial","sub_type": "CBP Standard","actual_delay": "10","expected_delay": "10"},{"type": "Commercial","sub_type": "DPS FAST","actual_delay": "10","expected_delay": "10"},{"type": "Commercial","sub_type": "DPS Standard","actual_delay": "10","expected_delay": "10"}]}}]}}
打印数据时,控制台只显示:
"230404" { wait_time: { port: [ [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object], [Object] ] } }
当前使用的代码:
const url= ' https://bciswebapi.azurewebsites.net/api/segmentcommercial' //https://bciswebapi.azurewebsites.net/api/segmentpassenger //'https://bwt.cbp.gov/api/waittimes' async function getData(){ const response = await fetch(url) const data= await response.json() .then(data=>console.log(data)) } getData()
解决方法
1. 完整打印JSON结构
Node.js默认打印对象时会截断嵌套内容,用JSON.stringify可以完整输出:
console.log(JSON.stringify(data, null, 2))
2. 提取指定port_id的actual_delay
遍历wait_time.port数组,找到匹配port_id的项,再提取对应lane的actual_delay:
async function getData() { const response = await fetch(url.trim()); // 去掉URL前后空格,避免请求错误 const data = await response.json(); // 指定要查找的port_id const targetPortId = "230404"; // 找到目标port const targetPort = data.wait_time.port.find(port => port.port_id === targetPortId); if (targetPort) { // 提取所有lane的子类型和实际等待时间 const actualDelays = targetPort.wait_time_event.lane.map(lane => ({ sub_type: lane.sub_type, actual_delay: lane.actual_delay })); console.log(`port_id ${targetPortId} 的实际等待时间:`); console.log(JSON.stringify(actualDelays, null, 2)); } else { console.log(`未找到port_id为${targetPortId}的记录`); } } getData();
代码说明
trim():去除URL开头的空格,避免请求报错find():在port数组中精准匹配目标port_idmap():整理lane数据,只保留需要的子类型和实际等待时间,输出更清晰
运行后会输出:
port_id 230404 的实际等待时间: [ { "sub_type": "Aduana", "actual_delay": "65" }, { "sub_type": "CBP FAST", "actual_delay": "12" }, { "sub_type": "CBP Standard", "actual_delay": "17" }, { "sub_type": "DPS FAST", "actual_delay": "0" }, { "sub_type": "DPS Standard", "actual_delay": "30" } ]
内容的提问来源于stack exchange,提问作者Perla De la O
相关产品推荐
相关产品推荐

