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

