JS按branch、environment分组对象 拼接pool字段并去重
问题说明
现有对象数组,需将branch(分支)、environment(环境)字段值相同的对象分组合并,拼接对应pool(资源池)字段值,最终移除重复对象。使用reduce实现时因返回单个对象导致其余对象遗漏,需匹配如下输入输出要求:
输入数据
const data = [ { branch: "master", environment: "dev", pool: "6g", service: "amex", }, { branch: "master", environment: "dev", pool: "6g", service: "amex", }, { branch: "feature/rest", environment: "dev", pool: "2g", service: "amex", }, { branch: "master", environment: "dev", pool: "4g", service: "amex", }, { branch: "hotfix/23", environment: "test", pool: "9g", service: "amex", }, { branch: "hotfix/23", environment: "test", pool: "1g", service: "amex", }, ];
预期输出
const result = [ { branch: "master", environment: "dev", pool: "6g, 4g", service: "amex", }, { branch: "feature/rest", environment: "dev", pool: "2g", service: "amex", }, { branch: "hotfix/23", environment: "test", pool: "9g,1g", service: "amex", }, ];
实现方案
之前用reduce出现对象遗漏,核心问题是累加器的数据结构选择错误:不要直接把单个合并对象作为累加返回值,先用键值对映射对象做临时分组存储,分组完成后再将映射值转为数组即可,全程不会丢失数据。
具体实现逻辑:
- 初始化
reduce累加器为空对象,作为临时分组表 - 遍历每个元素时,用
${branch}_${environment}拼接生成分组唯一key - 若key不存在,将当前元素浅拷贝后存入分组表,初始化对应分组
- 若key已存在,判断当前元素的
pool值是否已在分组的pool字段中存在,不存在则追加拼接,避免重复值 - 遍历完成后,用
Object.values()提取分组表的所有值,即为最终结果数组
完整代码
const result = Object.values( data.reduce((groupMap, item) => { const groupKey = `${item.branch}_${item.environment}`; if (!groupMap[groupKey]) { groupMap[groupKey] = { ...item }; } else { // 兼容逗号后带/不带空格的格式做去重判断 const existingPools = groupMap[groupKey].pool.split(/,\s*/); if (!existingPools.includes(item.pool)) { // 可按需修改拼接分隔符,示例用逗号+空格匹配通用格式 groupMap[groupKey].pool += `, ${item.pool}`; } } return groupMap; }, {}) );
效果说明
运行代码后输出结果完全匹配预期:
- 重复的对象、重复的pool值会被自动去重
- 仅当
branch和environment两个字段同时匹配时才会归入同一分组 - 最终返回标准数组格式,无对象遗漏问题
内容的提问来源于stack exchange,提问作者giiyiraj
相关产品推荐
相关产品推荐

