动态键对象数组合并:同周同角色工时求和的实现问题
实现方案
你可以先通过一个临时映射对象完成同周同角色的工时累加,再转换为要求的数组结构,这种方式逻辑更简单,性能也比每次在数组中查找匹配项更好:
完整代码
function reduceArray(arr) { // 先用对象做累加映射,key为周次,value存储对应周所有角色的工时总和 const weekMap = arr.reduce((acc, currentItem) => { // 提取当前项的周次(每个元素只有一个key,就是周次) const currentWeek = Object.keys(currentItem)[0]; // 提取当前项的角色和对应工时 const currentRoleData = currentItem[currentWeek]; const currentRole = Object.keys(currentRoleData)[0]; const currentHours = currentRoleData[currentRole]; // 周次不存在则初始化 if (!acc[currentWeek]) { acc[currentWeek] = {}; } // 角色不存在则初始化为0后累加,否则直接累加 acc[currentWeek][currentRole] = (acc[currentWeek][currentRole] || 0) + currentHours; return acc; }, {}); // 将映射对象转换为要求的数组格式 return Object.entries(weekMap).map(([week, roleHours]) => ({ [week]: roleHours })); }
把你给出的输入传入该函数,即可得到预期的输出结果。
原有代码的问题
- reduce回调没有返回累加的结果数组,导致每次迭代的累加值都是undefined
- 周次匹配逻辑错误:你写的
x[prop] === item[prop]是比较两个对象,对象为引用类型,就算内容一致也不会相等,实际应该比较的是键名(周次的字符串值)是否相等 - 角色匹配逻辑错误:你写的
x[prop][subProp] === item[prop][subProp]是在比较工时数值,实际应该比较角色名是否相同,相同就累加工时
内容的提问来源于stack exchange,提问作者user2868900
相关产品推荐
相关产品推荐

