如何按站点出现次数遍历对象数组并计算active-power平均值
解决方案:计算各站点15分钟窗口active-power平均值
你需要同时统计每个站点的active-power总和与记录次数,再通过总和/次数得到平均值。以下是修改后的Lambda代码,直接实现需求:
实现代码(forEach版本)
export const handler = async(event) => { // 存储每个站点的记录数和功率总和 const siteStats = {}; // 遍历所有IoT数据,累加统计值 event.forEach(data => { const siteName = data.site_name; const activePower = data["active-power"]; // 首次遇到站点时初始化统计项 if (!siteStats[siteName]) { siteStats[siteName] = { count: 0, sum: 0 }; } siteStats[siteName].count += 1; siteStats[siteName].sum += activePower; }); // 计算每个站点的平均值 const siteAverages = {}; for (const site in siteStats) { const { count, sum } = siteStats[site]; // 避免除以0的异常情况(实际场景可能存在无数据的站点) siteAverages[site] = count > 0 ? sum / count : 0; } console.log("各站点统计详情:", siteStats); console.log("各站点active-power平均值:", siteAverages); // 返回平均值结果,可按需写入数据库或其他存储 return siteAverages; };
更简洁的reduce版本
如果偏好函数式写法,也可以用reduce一次性构建统计对象:
export const handler = async(event) => { // 用reduce遍历数据,生成站点统计对象 const siteStats = event.reduce((acc, data) => { const site = data.site_name; const power = data["active-power"]; acc[site] = acc[site] || { count: 0, sum: 0 }; acc[site].count += 1; acc[site].sum += power; return acc; }, {}); // 转换统计对象为平均值结果 const siteAverages = Object.fromEntries( Object.entries(siteStats).map(([site, { count, sum }]) => [site, count > 0 ? sum / count : 0] ) ); console.log("各站点active-power平均值:", siteAverages); return siteAverages; };
测试输出结果
针对你提供的测试事件,运行后会得到:
各站点active-power平均值: { adodar: 8.566666666666666, jamanvada: 3.8166666666666667, abcd: 9.08 }
内容的提问来源于stack exchange,提问作者anonymous_33008899
相关产品推荐
相关产品推荐

