如何用纯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
相关产品推荐
相关产品推荐

