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

如何用纯JavaScript按Email键分组重复对象集合

纯JS实现按Email键分组重复对象集合

已完成的前置工作

  • 基于Email键筛选出的重复对象列表 [{}, {}]
  • 统计各Email出现次数的代码及结果:
    let countObj = {};
    let key='Email'
    let countFunc = key => {
      countObj[key] = ++countObj[key] || 1;
    }
    matchDuplicates.map(dup=>dup['Email']).forEach(countFunc);
    
    示例输出:
    { 
      email1@email1.com: 2,
      email2@email2.com: 4,
      email3@email3.com:2
    }
    
  • 生成去重后唯一对象数组的代码:
    const key='Email'
    const arrayUniqueByKey = [...new Map(matchDuplicates.map(item =>
      [item[key], item])).values()];
    

需求

使用纯JavaScript(无第三方依赖)实现将重复对象按Email作为键分组,每个键对应该Email的所有对象集合,示例输出:

{ 
  email1:[ 
    {name: 'john', age:32, Email: 'john@companyName1.com' , company: 'companyName1'}, 
    {name: 'john', age:32, Email: 'john@companyName1.com' , company: 'companyName1'} 
  ],
  email2:[ 
    {name: 'peter', age:40, Email: 'peter@email.com', company: 'companyName2'}, 
    {name: 'peter', age:39, Email: 'peter@email.com', company: 'aPreviousCompanyName'}, 
    {name: 'peter', age:38, Email: 'peter@email.com', company: 'aPreviousCompanyName'}, 
    {name: 'peter', age:40, Email: 'peter@email.com', company: 'companyName2'} 
  ],
  email3:[ 
    {name: 'nina' , age: 28, Email: 'nina@companyName3.com', company: 'companyName3'},
    {name: 'nina', age: 28, Email: 'nina@companyName3.com', company: 'companyName3'} 
  ]
}

背景:数据库数据结构混乱,对象键差异较大。

实现代码

可以通过Array.prototype.reduce方法快速实现分组,代码简洁且高效:

const key = 'Email';
const groupedByEmail = matchDuplicates.reduce((acc, current) => {
  const email = current[key];
  if (!acc[email]) {
    acc[email] = [];
  }
  acc[email].push(current);
  return acc;
}, {});

代码说明

  • 用reduce遍历重复对象列表,初始累加器为一个空对象{}
  • 提取每个对象的Email值作为分组键
  • 若累加器中无该键,则初始化对应的空数组
  • 将当前对象推入对应键的数组,最终返回分组完成的对象

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 10:50:36