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

如何动态创建并引用变量名,优化Node.js数据处理代码复用性

动态聚合站点快照与实时数据的Node.js实现方案

核心思路

用对象映射替代手动创建数组和switch/case逻辑,以站点列表的campusCode作为键值动态存储对应站点的快照数据,再通过批量查询实时数据并匹配追加,完全适配业务增长后的站点扩展需求,无需硬编码维护站点配置。

具体实现代码

// 假设已通过ParentLocation接口获取到站点列表
const siteList = await fetchParentLocations();

// 1. 初始化站点数据映射:键为campusCode,值为对应站点的数据数组
const siteDataMap = siteList.reduce((map, site) => {
  map[site.campusCode] = [];
  return map;
}, {});

// 2. 自动分类快照数据到对应站点数组
const weeklySnapshot = await fetchWeeklySnapshotData();
weeklySnapshot.forEach(snapshotItem => {
  // 假设快照数据携带campusCode用于匹配站点
  if (siteDataMap.hasOwnProperty(snapshotItem.campusCode)) {
    siteDataMap[snapshotItem.campusCode].push(snapshotItem);
  }
});

// 3. 批量查询实时数据并追加到对应站点
// 先收集所有站点ID,批量查询减少IO开销
const siteIds = siteList.map(site => site.id);
const realtimeData = await batchFetchRealtimeLocation(siteIds);

realtimeData.forEach(realtimeItem => {
  // 通过站点ID匹配对应的campusCode
  const targetSite = siteList.find(site => site.id === realtimeItem.siteId);
  if (targetSite && siteDataMap[targetSite.campusCode]) {
    // 按前端需要的结构追加,可标记数据类型方便区分
    siteDataMap[targetSite.campusCode].push({
      ...realtimeItem,
      dataType: 'realtime'
    });
  }
});

// 4. 转换为前端图表所需的结构化结果
const finalChartData = Object.entries(siteDataMap).map(([campusCode, data]) => ({
  campusCode,
  siteName: siteList.find(site => site.campusCode === campusCode).name, // 补全站点名称
  timelineData: data.sort((a, b) => new Date(b.timestamp) - new Date(a.timestamp)) // 按时间排序
}));

return finalChartData;

关键优化点

  • 动态适配站点:通过reduce基于站点列表自动生成数据容器,新增站点时无需修改代码
  • 性能优化:将逐个查询实时数据改为批量请求,减少网络IO次数
  • 容错处理:增加属性存在性判断,避免因数据不匹配导致的运行时错误
  • 可扩展性:后续新增站点属性或数据类型时,仅需调整映射键或数据处理逻辑

内容的提问来源于stack exchange,提问作者Shane Quinn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 14:52:21