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

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 }
// ]

代码思路说明:

  1. 数组合并:用扩展运算符...快速合并两个数组,统一后续处理逻辑
  2. 分组存储:借助Map按email对对象分组,能高效定位所有重复对象
  3. 分组过滤:
    • 先筛选每组内的flag: true项,存在则优先保留;
    • 若全为flag: false项,则仅保留一个,完全匹配需求规则

如果你的重复判断标识不是email而是name,只需要把代码里的item.email替换为item.name即可,适配性很强。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:14:50