API返回数据整理求助:按Cell聚合最后一条记录的异常KPI信息
解决方案
核心思路
先按cell维度分组,在每个分组内为每个kpi_name保留最新时间的记录,再从这些最新记录中筛选出anomaly=1的KPI,最后聚合出每个Cell的所属站点、异常KPI列表和整体异常状态。
代码实现
假设原始API返回数据结构如下(可替换为实际格式):
const rawData = [ { site: 'siteA', cell: 'cell1', kpi_name: 'RRC连接成功率', value: 99.5, anomaly: 0, time: '2024-05-20 10:00' }, { site: 'siteA', cell: 'cell1', kpi_name: 'RRC连接成功率', value: 90.2, anomaly: 1, time: '2024-05-20 10:10' }, { site: 'siteA', cell: 'cell1', kpi_name: '切换成功率', value: 98.1, anomaly: 0, time: '2024-05-20 10:00' }, { site: 'siteB', cell: 'cell2', kpi_name: 'RRC连接成功率', value: 85.3, anomaly: 1, time: '2024-05-20 10:05' }, { site: 'siteB', cell: 'cell2', kpi_name: '切换成功率', value: 92.0, anomaly: 1, time: '2024-05-20 10:05' }, ];
处理逻辑代码:
// 1. 按Cell分组,保留每个KPI的最新记录 const cellGroupMap = new Map(); rawData.forEach(item => { const { cell, site, kpi_name, time, anomaly } = item; if (!cellGroupMap.has(cell)) { cellGroupMap.set(cell, { site, kpiLatestRecords: new Map() // 存储该Cell下每个KPI的最新数据 }); } const cellInfo = cellGroupMap.get(cell); const existingKpi = cellInfo.kpiLatestRecords.get(kpi_name); // 仅保留时间更新的KPI记录 if (!existingKpi || new Date(time) > new Date(existingKpi.time)) { cellInfo.kpiLatestRecords.set(kpi_name, { anomaly, time }); } }); // 2. 转换为目标结构 const finalResult = Array.from(cellGroupMap.entries()).map(([cell, groupData]) => { // 筛选出最新记录中异常的KPI名称 const abnormalKpis = Array.from(groupData.kpiLatestRecords.entries()) .filter(([_, kpiData]) => kpiData.anomaly === 1) .map(([kpiName]) => kpiName); // 定义Cell异常状态:存在异常KPI则标记为1,否则为0 const anomalyStatus = abnormalKpis.length > 0 ? 1 : 0; return { cell, site: groupData.site, abnormalKpiList: abnormalKpis, anomalyStatus }; }); console.log(finalResult);
输出结果
[ { cell: 'cell1', site: 'siteA', abnormalKpiList: ['RRC连接成功率'], anomalyStatus: 1 }, { cell: 'cell2', site: 'siteB', abnormalKpiList: ['RRC连接成功率', '切换成功率'], anomalyStatus: 1 } ]
注意事项
- 时间比较:如果原始数据的
time是时间戳格式,直接用数值比较即可,无需转Date对象。 - 站点一致性:若同一Cell对应多个站点(极端情况),可改为取最新记录的站点,或者根据业务规则额外处理。
- 异常状态规则:可根据需求调整,比如要求所有KPI异常才标记Cell异常,只需修改
anomalyStatus的判断逻辑。
内容的提问来源于stack exchange,提问作者ScobbyBrady
相关产品推荐
相关产品推荐

