You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 17:45:45