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

基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 16:07:31