如何用JavaScript的reduce方法重组会议统计JSON为指定结构
正确实现会议统计数据重组方案
我来帮你搞定这个数据重组的问题!你的原代码只完成了收集周数的第一步,没有覆盖到UserName、month、meetingHash这三个核心分组维度,也没正确映射每个周的会议次数。咱们来写一个符合需求的实现:
实现思路
- 先固定所有需要的周字段(Week1到Week4,哪怕数据里没有也要保留并设为0)
- 用
UserName|month|meetingHash作为唯一分组键,确保每个组合只生成一条记录 - 初始化每条记录时,先把所有周的次数设为0,再根据原始数据更新对应周的数值
- 最后把分组后的对象转换成数组格式
完整代码
const data=[ { "UserName": "Sarathy Devaraju", "week": "Week 1", "MeetingHash": "Hold/Uncategorized", "monthinwords": "May", "count": 2 }, { "UserName": "Sarathy Devaraju", "week": "Week 2", "MeetingHash": "1st Presentation / Meeting", "monthinwords": "Jun", "count": 1 }, { "UserName": "Sarathy Devaraju", "week": "Week 1", "MeetingHash": "Follow-On Meetings", "monthinwords": "Jun", "count": 1 }, { "UserName": "Sarathy Devaraju", "week": "Week 2", "MeetingHash": "1st Presentation / Meeting", "monthinwords": "May", "count": 1 }, { "UserName": "Sarathy Devaraju", "week": "Week 3", "MeetingHash": "Follow-On Meetings", "monthinwords": "July", "count": 1 }, { "UserName": "Priya", "week": "Week 1", "MeetingHash": "Hold/Uncategorized", "monthinwords": "May", "count": 2 }, { "UserName": "Priya", "week": "Week 2", "MeetingHash": "1st Presentation / Meeting", "monthinwords": "Jun", "count": 1 }, { "UserName": "Priya", "week": "Week 1", "MeetingHash": "Follow-On Meetings", "monthinwords": "Jun", "count": 1 }, { "UserName": "Priya", "week": "Week 2", "MeetingHash": "1st Presentation / Meeting", "monthinwords": "May", "count": 1 }, { "UserName": "Priya", "week": "Week 1", "MeetingHash": "Follow-On Meetings", "monthinwords": "July", "count": 1 } ]; // 定义所有需要的周字段,确保Week1到Week4都存在 const allWeeks = ['Week 1', 'Week 2', 'Week 3', 'Week 4']; // 处理月份缩写(比如July转成Jul,匹配你期望的格式) const formatMonth = (month) => { const monthMap = { 'July': 'Jul', // 其他月份如果需要调整可以补充 }; return monthMap[month] || month; }; // 核心reduce逻辑 const result = Object.values(data.reduce((acc, row) => { // 生成唯一分组键:UserName+月份+会议类型 const key = `${row.UserName}|${formatMonth(row.monthinwords)}|${row.MeetingHash}`; // 如果该分组不存在,初始化基础结构 if (!acc[key]) { acc[key] = { UserName: row.UserName, month: formatMonth(row.monthinwords), meetingHash: row.MeetingHash, // 初始化所有周的count为0 ...Object.fromEntries(allWeeks.map(week => [week.replace(' ', ''), 0])) }; } // 更新当前周的count值 const weekKey = row.week.replace(' ', ''); // 把"Week 1"转成"Week1" acc[key][weekKey] += row.count; return acc; }, {})); console.log(result);
代码解释
formatMonth函数:处理月份缩写,把原始数据里的July转换成你期望的Jul,如果有其他月份需要调整可以直接补充映射- 分组键
key:确保每个UserName+month+meetingHash的组合唯一,避免重复生成记录 - 初始化结构时,用
Object.fromEntries把所有周字段设为0,保证输出结构完整 - 最后用
Object.values把分组对象转换成数组,就是你想要的格式
运行这段代码后,输出的结果就完全匹配你期望的JSON结构啦!
内容的提问来源于stack exchange,提问作者user3386779
相关产品推荐
相关产品推荐

