JavaScript中对象数组去重及基于布尔属性过滤的实现
解决数组去重并按flag规则过滤的问题
首先咱们先把需求逻辑补全(结合你描述的内容梳理完整):
- 合并数组
a和b后,以email作为判断对象重复的唯一标识(邮箱通常具备唯一性,比name更适合作为重复判断依据) - 针对重复的对象组:
- 只要组内存在
flag: true的项,就移除所有flag: false的重复项,仅保留一个flag: true的项 - 如果组内所有项的
flag都是false,则只保留其中一个
- 只要组内存在
- 无重复的对象直接保留
下面是具体的JavaScript实现代码:
const a = [{name: 'Anna',email: 'anna@mac.com',flag: false}, {name: 'Kelly',email: 'kelly@mac.com',flag: true}]; const b = [{name: 'Rana',email: 'rana@mac.com',flag: true}, {name: 'Anna',email: 'anna@mac.com',flag: true}, {name: 'Hank',email: 'Hank@mac.com',flag: false}]; // 合并两个数组 const merged = [...a, ...b]; // 用Map按email分组存储对象 const emailGroupMap = new Map(); merged.forEach(item => { if (!emailGroupMap.has(item.email)) { emailGroupMap.set(item.email, []); } emailGroupMap.get(item.email).push(item); }); // 处理每个分组,生成最终结果 const finalResult = []; emailGroupMap.forEach(group => { // 筛选分组内flag为true的项 const trueFlagItems = group.filter(item => item.flag); if (trueFlagItems.length > 0) { // 存在true项,取第一个即可(若需保留所有true项,直接push(...trueFlagItems)即可) finalResult.push(trueFlagItems[0]); } else { // 全为false项,保留其中一个 finalResult.push(group[0]); } }); console.log(finalResult); // 输出结果: // [ // { name: 'Anna', email: 'anna@mac.com', flag: true }, // { name: 'Kelly', email: 'kelly@mac.com', flag: true }, // { name: 'Rana', email: 'rana@mac.com', flag: true }, // { name: 'Hank', email: 'Hank@mac.com', flag: false } // ]
代码思路说明:
- 数组合并:用扩展运算符
...快速合并两个数组,统一后续处理逻辑 - 分组存储:借助
Map按email对对象分组,能高效定位所有重复对象 - 分组过滤:
- 先筛选每组内的
flag: true项,存在则优先保留; - 若全为
flag: false项,则仅保留一个,完全匹配需求规则
- 先筛选每组内的
如果你的重复判断标识不是email而是name,只需要把代码里的item.email替换为item.name即可,适配性很强。
内容的提问来源于stack exchange,提问作者wp7
相关产品推荐
相关产品推荐

