如何遍历含idMembers的对象数组并按唯一ID累加时长?
实现ID时长累加并转换为指定格式
原始数据
[ { idMembers: [ '62d7001a7446ee76e5e2856f' ], hours: 5 }, { idMembers: [ '62d6f80e28907a0385a3a41e', '62d7001a7446ee76e5e2856f' ], hours: 4 } ]
需求说明
提取idMembers中的每个唯一ID,累加所有对象中该ID对应的时长,最终转换为[{唯一ID: 总时长}, ...]的格式。比如示例中ID 62d7001a7446ee76e5e2856f总时长为9,62d6f80e28907a0385a3a41e总时长为4。
实现方法
通过对象暂存累加结果,再转换为目标数组格式,代码如下:
const data = [ { idMembers: [ '62d7001a7446ee76e5e2856f' ], hours: 5 }, { idMembers: [ '62d6f80e28907a0385a3a41e', '62d7001a7446ee76e5e2856f' ], hours: 4 } ]; // 1. 用对象累加每个ID的总时长 const hourMap = {}; data.forEach(item => { const { idMembers, hours } = item; idMembers.forEach(id => { hourMap[id] = (hourMap[id] || 0) + hours; }); }); // 2. 转换为目标数组格式 const result = Object.entries(hourMap).map(([id, totalHours]) => ({ [id]: totalHours })); console.log(result); // 输出: // [ // { '62d7001a7446ee76e5e2856f': 9 }, // { '62d6f80e28907a0385a3a41e': 4 } // ]
逻辑说明
- 对象暂存:用
hourMap存储每个ID的累计时长,遍历原始数据时,对每个idMembers里的ID进行累加,不存在的ID初始化为0后再加当前时长。 - 格式转换:通过
Object.entries()将对象转为键值对数组,再用map()把每个键值对转换成单个对象,得到目标格式。
该方案支持后续向原始数组添加更多数据,只需重新执行上述逻辑即可。
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

