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

如何将多个对象数组合并为单个对象数组(按userID分组)

如何按userID合并多个对象数组?

这个需求很常见,我来给你一个高效且易读的实现方案👇

实现思路

  1. 先用一个Map来存储每个userID对应的合并对象——用Map的好处是查找userID的速度极快,数据量大的时候比反复遍历数组高效得多。
  2. 先处理arr1(因为每个userID在这里只有一条基础数据),把name和userID先存入Map。
  3. 再依次处理arr2和arr3,把对应的字段(lang、SET)添加到对应userID的对象里,如果字段不存在就初始化一个数组,存在就push新值。
  4. 最后把Map里的所有值转换成数组,就是最终结果。

完整代码实现

var arr1 = [{"userID": 554,"name":"abc"},{"userID": 555,"name":"xyz"}];
var arr2 = [{"userID": 554,"lang":"ENG"},{"userID": 554,"lang":"GER"},{"userID": 555,"lang":"ENG"}];
var arr3 = [{"userID": 554,"SET":"QWE"},{"userID": 555,"SET":"ABC"},{"userID": 555,"SET":"XYZ"}];

// 初始化Map存储合并后的对象
const userMap = new Map();

// 第一步:处理arr1的基础数据
arr1.forEach(user => {
  userMap.set(user.userID, {
    userID: user.userID,
    name: user.name,
    lang: [],
    SET: []
  });
});

// 第二步:处理arr2的lang字段
arr2.forEach(item => {
  const targetUser = userMap.get(item.userID);
  if (targetUser) {
    targetUser.lang.push(item.lang);
  }
});

// 第三步:处理arr3的SET字段
arr3.forEach(item => {
  const targetUser = userMap.get(item.userID);
  if (targetUser) {
    targetUser.SET.push(item.SET);
  }
});

// 把Map的值转成数组,得到最终结果
const final = Array.from(userMap.values());
console.log(final);

输出结果

运行上面的代码后,final的结构会是:

[
  {
    "userID": 554,
    "name": "abc",
    "lang": ["ENG", "GER"],
    "SET": ["QWE"]
  },
  {
    "userID": 555,
    "name": "xyz",
    "lang": ["ENG"],
    "SET": ["ABC", "XYZ"]
  }
]

额外说明

  • 如果你的数组里可能存在arr1没有覆盖到的userID(比如arr2里有个userID是556但arr1里没有),可以在处理arr2/arr3的时候先判断Map里有没有这个userID,如果没有就新建一个对象,避免遗漏。
  • 如果需要更通用的合并方法(比如不确定有多少个数组),可以把处理数组的逻辑封装成一个函数,批量传入数组和对应的字段名,扩展性会更好。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:32:03