JavaScript合并按周/分类统计的JSON数据遇阻,求解决方案
解决JavaScript多维度JSON数据合并:按用户、月份、会议分类整合周计数
问题背景
你手头有一组包含用户、周、会议分类、月份和计数的JSON数据,想要按UserName、month(对应原数据的monthinwords)、meetingHash(对应原数据的MeetingHash)三个维度合并,把Week 1到Week 4的计数整合到同一行,没有数据的周填0。但目前用map处理时,同一维度下的不同周会生成多条记录(比如用户Sarathy Devaraju在5月、分类为Hold/Uncategorized的Week1和Week2数据分成了两行),需要调整成目标结构。
核心思路
用reduce方法创建一个以用户-月份-会议分类组合为唯一键的临时对象,遍历原始数据时,把对应周的计数填充到该键对应的对象中。初始时每个合并对象的Week1到Week4都设为0,再用实际数据覆盖有值的周,最后把临时对象转成数组即可。
完整代码示例
首先看原始数据示例:
const data = [ { "UserName": "Sarathy Devaraju", "week": "Week 1", "MeetingHash": "Hold/Uncategorized", "monthinwords": "May", "count": 2 }, { "UserName": "Sarathy Devaraju", "week": "Week 2", "MeetingHash": "Hold/Uncategorized", "monthinwords": "May", "count": 3 }, { "UserName": "John Doe", "week": "Week 3", "MeetingHash": "Project Sync", "monthinwords": "May", "count": 1 }, // 更多数据... ];
然后是处理代码:
const WEEKS = ["Week 1", "Week 2", "Week 3", "Week 4"]; // 周名称映射:把"Week 1"转成"Week1",匹配目标输出的字段名 const weekKeyMap = WEEKS.reduce((map, week) => { map[week] = week.replace(' ', ''); return map; }, {}); const mergedResult = data.reduce((acc, item) => { // 生成唯一分组键:用户-月份-会议分类 const groupKey = `${item.UserName}-${item.monthinwords}-${item.MeetingHash}`; // 如果该分组还不存在,初始化一个对象,Week1到Week4默认0 if (!acc[groupKey]) { acc[groupKey] = { UserName: item.UserName, month: item.monthinwords, meetingHash: item.MeetingHash, Week1: 0, Week2: 0, Week3: 0, Week4: 0 }; } // 把当前item的count赋值到对应的周字段 const targetWeekKey = weekKeyMap[item.week]; acc[groupKey][targetWeekKey] = item.count; return acc; }, {}); // 把临时对象的值转成数组,得到最终结果 const result = Object.values(mergedResult);
期望输出示例
运行上述代码后,你会得到如下结构的结果:
[ { "UserName": "Sarathy Devaraju", "month": "May", "meetingHash": "Hold/Uncategorized", "Week1": 2, "Week2": 3, "Week3": 0, "Week4": 0 }, { "UserName": "John Doe", "month": "May", "meetingHash": "Project Sync", "Week1": 0, "Week2": 0, "Week3": 1, "Week4": 0 } ]
关键说明
- 分组键的设计:用用户、月份、会议分类的组合作为唯一键,确保同一维度的记录会被合并到同一个对象中。
- 默认值初始化:每个新分组都会先设置Week1到Week4为0,避免出现缺失字段的情况。
- 周名称转换:通过
weekKeyMap把原始的"Week 1"格式转换成目标的"Week1"字段名,保证输出结构符合要求。
内容的提问来源于stack exchange,提问作者user3386779
相关产品推荐
相关产品推荐

