如何将多个对象数组合并为单个对象数组(按userID分组)
如何按
userID合并多个对象数组? 这个需求很常见,我来给你一个高效且易读的实现方案👇
实现思路
- 先用一个Map来存储每个
userID对应的合并对象——用Map的好处是查找userID的速度极快,数据量大的时候比反复遍历数组高效得多。 - 先处理
arr1(因为每个userID在这里只有一条基础数据),把name和userID先存入Map。 - 再依次处理
arr2和arr3,把对应的字段(lang、SET)添加到对应userID的对象里,如果字段不存在就初始化一个数组,存在就push新值。 - 最后把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
相关产品推荐
相关产品推荐

