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

如何移除JavaScript数组中基于唯一id的重复对象

基于ID移除JavaScript数组中的重复对象(高效通用方案)

需求很明确:移除数组中基于id属性重复的对象,方案要通用,不能依赖对象的其他属性名称——不管数组里的对象是带name/age还是emp_name/sal,只要有id就能处理。

方案1:利用Set过滤(简洁高效)

这种方式遍历一次数组,用Set记录已经出现过的id,过滤掉重复项,时间复杂度O(n),代码简洁直观:

function removeDuplicatesById(arr) {
  const seenIds = new Set();
  return arr.filter(item => {
    if (seenIds.has(item.id)) return false;
    seenIds.add(item.id);
    return true;
  });
}

// 测试示例1
let arr1 = [
  { id: 1, name: 'a', age: 10 },
  { id: 2, name: 'a', age: 10 },
  { id: 3, name: 'b', age: 11 }
];
console.log(removeDuplicatesById(arr1));
// 输出结果:[{ id: 1, name: 'a', age: 10 }, { id: 3, name: 'b', age: 11 }]

// 测试示例2
let arr2 = [
  { id: 1, emp_name: 'x', sal: 33 },
  { id: 2, emp_name: 'x', sal: 33 },
  { id: 3, emp_name: 'z', sal: 35 }
];
console.log(removeDuplicatesById(arr2));
// 输出结果:[{ id: 1, emp_name: 'x', sal: 33 }, { id: 3, emp_name: 'z', sal: 35 }]

这个方案会保留数组中第一个出现的同id对象,过滤掉后续重复项,完全不依赖其他属性,通用性拉满。

方案2:利用Map灵活控制(保留首/尾项都可以)

如果需要灵活选择保留第一个还是最后一个出现的重复对象,用Map更方便:

  • 保留第一个出现的对象:
function removeDuplicatesByIdKeepFirst(arr) {
  const idMap = new Map();
  for (const item of arr) {
    // 只在id未被记录时存入Map
    if (!idMap.has(item.id)) {
      idMap.set(item.id, item);
    }
  }
  return Array.from(idMap.values());
}
  • 保留最后一个出现的对象:
function removeDuplicatesByIdKeepLast(arr) {
  const idMap = new Map();
  for (const item of arr) {
    // 后续同id对象直接覆盖之前的记录
    idMap.set(item.id, item);
  }
  return Array.from(idMap.values());
}

Map的键查找也是O(1)操作,整体时间复杂度同样是O(n),效率很高,而且能灵活调整保留策略。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 17:45:16