JavaScript如何对数组对象按name分组并累加totalHour数值
你可以通过以下两种常用方式实现该需求:
方法1:使用Array.prototype.reduce(写法更简洁)
核心逻辑是用累加器对象存储每个name对应的累计数据,最后将对象转为目标数组:
const originalArr = [ { name: "Petter", totalHour: 14 }, { name: "Klaus", totalHour: 13 }, { name: "Petter", totalHour: 4 }, { name: "Petter", totalHour: 9 }, { name: "Trevor", totalHour: 8 } ]; const result = Object.values(originalArr.reduce((acc, current) => { // 已存在同名项则累加时长,不存在则初始化 acc[current.name] = acc[current.name] ? { ...acc[current.name], totalHour: acc[current.name].totalHour + current.totalHour } : { ...current }; return acc; }, {})); console.log(result);
方法2:使用forEach遍历(逻辑更直观,适合新手理解)
核心逻辑是用临时映射表记录已处理的name,遍历过程中直接更新结果:
const originalArr = [ { name: "Petter", totalHour: 14 }, { name: "Klaus", totalHour: 13 }, { name: "Petter", totalHour: 4 }, { name: "Petter", totalHour: 9 }, { name: "Trevor", totalHour: 8 } ]; const tempMap = {}; const result = []; originalArr.forEach(item => { if (tempMap[item.name]) { // 同名项已存在,累加时长 tempMap[item.name].totalHour += item.totalHour; } else { // 首次出现该name,存入映射表和结果数组 const newItem = { ...item }; tempMap[item.name] = newItem; result.push(newItem); } }); console.log(result);
两种方法运行后得到的result都是你需要的目标结构。
内容的提问来源于stack exchange,提问作者Guilherme Hepfener
相关产品推荐
相关产品推荐

