如何用JavaScript按日期合并嵌套数组并求和slotAvailable?
按日期维度整合JSON数据的JavaScript实现
需求说明
- 按
date字段分组整合数据 - 每组内合并所有
shortlisted数组并去重 - 每组内对
slotAvailable字段求和
输入数据示例
const inputData = [ { date: "2024-05-20", dayResult: [ { shortlisted: ["A", "B"], slotAvailable: 2 }, { shortlisted: ["B", "C"], slotAvailable: 3 } ] }, { date: "2024-05-21", dayResult: [ { shortlisted: ["D"], slotAvailable: 1 }, { shortlisted: ["D", "E"], slotAvailable: 4 } ] } ];
期望输出示例
const expectedOutput = [ { date: "2024-05-20", mergedShortlisted: ["A", "B", "C"], totalSlots: 5 }, { date: "2024-05-21", mergedShortlisted: ["D", "E"], totalSlots: 5 } ];
正确实现代码
function aggregateByDate(data) { // 先按日期分组,聚合对应的数据 const groupedData = data.reduce((acc, current) => { const { date, dayResult } = current; // 初始化当前日期的聚合容器 if (!acc[date]) { acc[date] = { shortlistSet: new Set(), slotTotal: 0 }; } // 遍历当前日期的所有dayResult项 dayResult.forEach(item => { // 用Set自动去重shortlisted元素 item.shortlisted.forEach(name => acc[date].shortlistSet.add(name)); // 累加slotAvailable数值 acc[date].slotTotal += item.slotAvailable; }); return acc; }, {}); // 把分组对象转换成期望的数组格式 return Object.entries(groupedData).map(([date, values]) => ({ date, mergedShortlisted: Array.from(values.shortlistSet), totalSlots: values.slotTotal })); } // 测试调用 const result = aggregateByDate(inputData); console.log(result);
代码关键点说明
- 用
reduce快速按日期分组,避免重复遍历 - 利用
Set的自动去重特性处理shortlisted数组,比手动遍历判断去重更高效简洁 - 遍历
dayResult时同步完成数组合并和数值求和,一次遍历完成两个操作 - 最后通过
Object.entries和map把分组对象转换成符合要求的数组结构
内容的提问来源于stack exchange,提问作者Tushar
相关产品推荐
相关产品推荐

