按公司名高效归并多维数组:数值累加与补全缺失字段
高效合并同公司多维数组的实现方案
核心思路
这是个很常见的数据聚合需求,最高效的实现方式是利用对象键的唯一性做临时映射:用公司名称作为键,把每个公司的合并数据存在对应的值里,只需要遍历一次原数组就能完成所有合并操作,时间复杂度是O(n),数据量越大,这个方案的优势越明显。
代码示例(以JavaScript为例)
先假设你的原始数组结构如下(补全示例方便演示):
const originalArray = [ { company: 'Company A', value1: 10, value2: 20, email: 'a@example.com', phone: '123456' }, { company: 'Company A', value1: 5, value2: 15, email: null, phone: '789012' }, { company: 'Company B', value1: 8, value2: 12, email: 'b@example.com', phone: null }, { company: 'Company B', value1: 12, value2: 8, email: 'b_new@example.com', phone: '345678' }, { company: 'Company C', value1: 25, value2: 30, email: null, phone: null } ];
然后编写合并函数:
function mergeCompanyData(arr) { const companyMap = {}; for (const item of arr) { const { company, value1, value2, email, phone } = item; // 若当前公司未被处理过,初始化合并模板 if (!companyMap[company]) { companyMap[company] = { company, value1: 0, value2: 0, email: null, phone: null }; } // 累加数值字段 companyMap[company].value1 += value1; companyMap[company].value2 += value2; // 补全邮箱:仅当当前项邮箱有效且映射中邮箱为空时更新 if (email && !companyMap[company].email) { companyMap[company].email = email; } // 补全电话:规则和邮箱一致 if (phone && !companyMap[company].phone) { companyMap[company].phone = phone; } } // 将映射对象转为数组,得到最终结果 return Object.values(companyMap); } // 执行函数获取合并结果 const resultArray = mergeCompanyData(originalArray); console.log(resultArray);
预期输出结果
[ { company: 'Company A', value1: 15, value2: 35, email: 'a@example.com', phone: '123456' }, { company: 'Company B', value1: 20, value2: 20, email: 'b@example.com', phone: '345678' }, { company: 'Company C', value1: 25, value2: 30, email: null, phone: null } ]
逻辑细节说明
- 高效性:仅一次遍历就完成所有合并,避免了嵌套循环的O(n²)复杂度,大数据场景下性能优势显著。
- 字段灵活性:如果你的数组有其他数值字段,只需要在累加逻辑里新增对应字段即可;如果需要保留所有有效邮箱/电话(而非第一个),可以把字段改成数组存储,比如
email: [...(companyMap[company].email || []), email].filter(Boolean)。 - 空值处理:严格按照规则,只在缺失时填充有效值,不会覆盖已存在的有效字段。
内容的提问来源于stack exchange,提问作者MattMcCode
相关产品推荐
相关产品推荐

