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

如何聚合JSON数组中同一用户的项目字段,消除数据冗余?

高效合并用户项目记录的简洁方法

这是个非常常见的数据聚合需求,最简洁高效的实现方式之一就是用 JavaScript 的 Array.reduce() 方法,核心逻辑几行就能搞定,而且时间复杂度是 O(n),处理大规模数据也很顺畅。

咱们先看原始数据:

const originalData = [
  {user_id:1, name: "Person A", project: "Project A"},
  {user_id:1, name: "Person A", project: "Project B"},
  {user_id:2, name: "Person B", project: "Project A"},
  {user_id:2, name: "Person B", project: "Project C"},
  {user_id:3, name: "Person C", project: "Project D"}
];

接下来是核心实现代码:

const aggregatedData = Object.values(
  originalData.reduce((acc, current) => {
    // 用user_id作为唯一标识,避免重复用户
    if (!acc[current.user_id]) {
      acc[current.user_id] = {
        user_id: current.user_id,
        name: current.name,
        active_projects: []
      };
    }
    // 将当前项目推入用户的项目数组
    acc[current.user_id].active_projects.push(current.project);
    return acc;
  }, {}) // 初始化空对象作为累加器
);

console.log(aggregatedData);

逻辑解释:

  • 用 reduce 遍历原始数组,acc 是我们的临时累加对象,用来存储每个用户的聚合信息——键是唯一的 user_id,值是最终要生成的用户条目。
  • 如果当前用户还没出现在累加对象里,就先初始化一个包含 user_id、name 和空数组 active_projects 的对象。
  • 每次遍历都把当前的 project 推到对应用户的 active_projects 数组中。
  • 最后用 Object.values() 把累加对象里的用户条目提取出来,转换成你需要的数组格式。

这种方法的优势在于只需要遍历一次原始数据,对象的键查找操作是 O(1) 的,整体效率非常高,不管数据量大小都能很好地处理。

内容的提问来源于stack exchange,提问作者Sparsh Agarwal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 18:22:43