如何聚合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
相关产品推荐
相关产品推荐

