基于Device_MAC聚合数组对象并计算完成状态占比的实现求助
解决数组对象按Device_MAC聚合计算的问题
嗨,我来帮你搞定这个数组聚合的需求!你已经成功提取了唯一的Device_MAC列表,不过我们可以优化一下实现方式——直接遍历原始数据时就完成分组统计,这样效率更高,代码也更简洁。
这里是完整的实现代码,完全匹配你想要的输出格式:
const data = [ { Device_MAC: "45:6F:28:C1:2E:C0", Status: "Complete", Total: 1, Device_Name: "Device 1" }, { Device_MAC: "44:6F:28:C1:2E:C1", Status: "Complete", Total: 2, Device_Name: "Device 2" }, { Device_MAC: "44:6F:28:C1:2E:C1", Status: "Incomplete", Total: 4, Device_Name: "Device 2" }, { Device_MAC: "44:6F:28:C1:2E:C0", Status: "Complete", Total: 63, Device_Name: "Device 3" }, { Device_MAC: "44:6F:28:C1:2E:C0", Status: "Incomplete", Total: 34, Device_Name: "Device 3" }, ]; if (data.length) { // 用对象分组存储每个Device_MAC的统计数据 const macGroup = {}; data.forEach(item => { const { Device_MAC, Status, Total, Device_Name } = item; // 首次遇到该MAC时,初始化统计结构 if (!macGroup[Device_MAC]) { macGroup[Device_MAC] = { Device_MAC, Device_Name, totalComplete: 0, totalAll: 0 }; } // 累加所有状态的Total总和 macGroup[Device_MAC].totalAll += Total; // 如果是Complete状态,单独累加完成计数 if (Status === "Complete") { macGroup[Device_MAC].totalComplete += Total; } }); // 将分组对象转换为目标数组,计算完成占比 const output = Object.values(macGroup).map(stat => { // 避免除以0的情况(健壮性处理) const percentage = stat.totalAll > 0 ? (stat.totalComplete / stat.totalAll * 100) : 0; return { Device_MAC: stat.Device_MAC, Device_Name: stat.Device_Name, Total: stat.totalAll, // 保留两位小数,和你的示例输出一致 Percentage: Number(percentage.toFixed(2)) }; }); console.log(output); }
关键逻辑说明:
- 分组统计:用
macGroup对象以Device_MAC为键,一次性遍历原始数据就完成了总计数和完成计数的累加,比先提取unique MAC再二次遍历更高效 - 百分比计算:用
toFixed(2)保留两位小数,再转成Number类型避免返回字符串;同时增加了除以0的判断,防止极端情况报错 - 结构转换:用
Object.values()把分组对象转为数组,直接映射成你需要的输出结构
运行这段代码后,就能得到和你示例完全一致的output数组啦!
内容的提问来源于stack exchange,提问作者Dhaval Darji
相关产品推荐
相关产品推荐

