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

按公司名高效归并多维数组:数值累加与补全缺失字段

高效合并同公司多维数组的实现方案

核心思路

这是个很常见的数据聚合需求,最高效的实现方式是利用对象键的唯一性做临时映射:用公司名称作为键,把每个公司的合并数据存在对应的值里,只需要遍历一次原数组就能完成所有合并操作,时间复杂度是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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:22:40