filter单独去重不可行,需配合indexOf(适合基础类型)或Set(更高效,支持对象按字段去重),均返回新数组且不修改原数组。

用 filter 单独去重不是最直接的方式,因为它本身不记录状态;但可以配合 indexOf 或 Set 实现“保留首次出现的 ID”,达到过滤重复的效果。
用 filter + indexOf 保留第一个出现的 ID
原理:对每个元素检查它在原数组中第一次出现的位置是否等于当前索引。只有首次出现时才保留。
示例:
const userIds = [101, 102, 101, 103, 102, 104]; const uniqueIds = userIds.filter((id, index) => userIds.indexOf(id) === index); // 结果:[101, 102, 103, 104]
✅ 适合简单类型(如数字、字符串)
❌ 不适用于对象数组(因为对象引用不同,即使内容相同也会被当作不同)
用 filter + Set 记录已见 ID(更高效,推荐)
用一个外部 Set 缓存已处理过的 ID,每次只保留未见过的项。时间复杂度 O(n),比多次调用 indexOf 更优。
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
示例:
const userIds = [101, 102, 101, 103, 102, 104];
const seen = new Set();
const uniqueIds = userIds.filter(id => {
if (seen.has(id)) return false;
seen.add(id);
return true;
});
// 结果:[101, 102, 103, 104]
如果数据是用户对象,按 id 字段去重
不能直接比较对象,需提取 id 属性判断重复:
const users = [
{ id: 101, name: 'Alice' },
{ id: 102, name: 'Bob' },
{ id: 101, name: 'Alice2' },
{ id: 103, name: 'Charlie' }
];
<p>const seenIds = new Set();
const uniqueUsers = users.filter(user => {
if (seenIds.has(user.id)) return false;
seenIds.add(user.id);
return true;
});
// 结果:保留 id=101、102、103 的第一个对象
注意:filter 不修改原数组,返回新数组
所有上述方法都生成新数组,原数组保持不变。如需覆盖原变量,需显式赋值:
userIds = userIds.filter(/* ... */); // 覆盖原变量
如果只是临时去重,建议保持不可变习惯,避免副作用。

















