按项目与员工分组求和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); } });
修复逻辑说明
- 使用
Map做快速查找,比findIndex遍历数组的效率更高,尤其适合数据量较大的场景 - 每次创建全新对象,完全不依赖原始数据的引用,热重载时始终基于干净的原始数据计算
- 直接生成目标格式,无需后续额外处理字段
内容的提问来源于stack exchange,提问作者Davide la Fogia
相关产品推荐
相关产品推荐

