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

按项目与员工分组求和hours字段及代码异常BUG求助

问题排查与解决方案

BUG根源

你的代码直接操作了原始数据的引用:

  • 执行newRows.push(element)时,是把原始数组中的对象引用存入了newRows
  • 累加newRows[index].hours += element.hours时,实际修改的是原始数组对应对象的hours值
  • 当文件修改触发热重载时,分组逻辑会重复执行,但此时原始数组的hours已被之前的执行修改,导致重复累加;刷新页面后原始数据重新加载,才恢复正常

修复后的代码

核心是创建新对象,彻底隔离原始数据,同时直接生成符合期望的输出结构:

const groupedProjects = [];
const lookupMap = new Map();

projects.forEach(item => {
  // 用项目ID+员工ID作为唯一标识,避免名称重复导致分组错误
  const uniqueKey = `${item.project.id}-${item.employee.id}`;
  
  if (lookupMap.has(uniqueKey)) {
    // 已存在分组,累加小时数
    lookupMap.get(uniqueKey).hours += item.hours;
  } else {
    // 创建全新对象,仅保留需要的字段
    const newEntry = {
      project: item.project.name,
      employee: item.employee.name,
      hours: item.hours
    };
    groupedProjects.push(newEntry);
    lookupMap.set(uniqueKey, newEntry);
  }
});

修复逻辑说明

  1. 使用Map做快速查找,比findIndex遍历数组的效率更高,尤其适合数据量较大的场景
  2. 每次创建全新对象,完全不依赖原始数据的引用,热重载时始终基于干净的原始数据计算
  3. 直接生成目标格式,无需后续额外处理字段

内容的提问来源于stack exchange,提问作者Davide la Fogia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 11:22:41