filter本身不能直接去重,需结合indexof、includes或findindex等判断首次出现;set+扩展运算符是更高效简洁的日常方案,但对象数组需额外处理。

filter 本身不能直接去重,它只是按条件筛选元素;要去掉重复项,需要配合其他方法(比如 indexOf 或 includes)判断“是否第一次出现”。
用 indexOf 实现去重(适合基础数组)
原理:遍历数组时,只保留当前元素在原数组中**首次出现的位置**等于当前索引的项。
const arr = [1, 2, 2, 3, 3, 4]; const unique = arr.filter((item, index) => arr.indexOf(item) === index); // 结果:[1, 2, 3, 4]
- ✅ 简单直观,兼容性好(支持 IE9+)
- ❌ 对于大数组性能略低(每次调用 indexOf 都要从头遍历)
用 includes + 新建临时数组(更易理解)
借助一个空数组记录已见过的值,用 includes 判断是否重复:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
const arr = ['a', 'b', 'a', 'c'];
const seen = [];
const unique = arr.filter(item => {
if (seen.includes(item)) return false;
seen.push(item);
return true;
});
// 结果:['a', 'b', 'c']
- ✅ 逻辑清晰,适合初学者理解
- ⚠️ 注意:
seen是外部变量,不是纯函数写法
处理对象数组的去重(按某个字段)
如果数组里是对象,比如按 id 去重,可以用 findIndex 或 Set + map:
const users = [
{ id: 1, name: 'Alice' },
{ id: 2, name: 'Bob' },
{ id: 1, name: 'Alice2' }
];
const uniqueById = users.filter((user, index, self) =>
self.findIndex(u => u.id === user.id) === index
);
// 结果:[{ id: 1, name: 'Alice' }, { id: 2, name: 'Bob' }]
- ✅ 不依赖额外变量,保持函数式风格
- ❌ 复杂度为 O(n²),大数据量建议用 Map 优化
更高效方案:Set + 扩展运算符(推荐日常使用)
虽然不是 filter,但这是最常用、简洁又高效的去重方式:
const arr = [1, 2, 2, 3]; const unique = [...new Set(arr)]; // [1, 2, 3]
- ✅ 原生支持,性能好,代码短
- ❌ 不适用于对象数组(因为对象引用不同,Set 认为不重复)
- ? 对象数组可先 map 出 key 数组,再结合 filter 使用
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










