filter配合findindex去重最常用清晰,通过判断元素id首次出现索引是否等于当前索引来保留首次出现项;reduce或set方案性能更优,map一行写法简洁但保留最后出现项。

用 filter() 配合 findIndex() 或用 reduce() 是最常用、清晰且兼容性好的方式。关键在于“记录已出现的 ID”,避免重复保留。
用 filter + findIndex 去重(推荐)
遍历数组,只保留当前元素的 ID 第一次出现的位置。
说明:对每个元素,检查它在原数组中第一次出现的索引是否等于当前索引;是,就保留。
示例代码:
const arr = [
{ id: 1, name: 'Alice' },
{ id: 2, name: 'Bob' },
{ id: 1, name: 'Alice2' },
{ id: 3, name: 'Charlie' }
];
const uniqueArr = arr.filter((item, index) =>
arr.findIndex(obj => obj.id === item.id) === index
);
// 结果:[{ id: 1, name: 'Alice' }, { id: 2, name: 'Bob' }, { id: 3, name: 'Charlie' }]
用 reduce 实现去重(适合链式操作)
维护一个临时对象或 Map 记录已处理的 ID,遇到新 ID 才推入结果数组。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
优点:只遍历一次,性能略优;适合需要同时做其他聚合操作的场景。
示例代码:
const uniqueArr = arr.reduce((acc, current) => {
const exists = acc.some(item => item.id === current.id);
if (!exists) acc.push(current);
return acc;
}, []);
更高效写法(用 Set 记 ID):
const seen = new Set();
const uniqueArr = arr.filter(item => {
if (seen.has(item.id)) return false;
seen.add(item.id);
return true;
});
注意点和常见坑
- ID 类型要一致:
1和'1'被视为不同,必要时统一转为字符串或数字 - 原始数组会被保留,以上方法都返回新数组,不修改原数组
- 如果想保留最后一次出现的同 ID 元素,把
filter + findIndex改成lastIndexOf即可 - IE 不支持
Set或箭头函数?可用{} + hasOwnProperty模拟哈希表
一行简洁版(ES6+ 环境)
适合快速写脚本,语义稍弱但够用:
const uniqueArr = [...new Map(arr.map(item => [item.id, item])).values()];
原理:Map 键唯一,相同 id 会自动覆盖,再取 values 就是去重后数组。注意:它保留的是每个 ID 最后一次出现的元素。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










