filter配合indexOf可实现数组去重,原理是只保留元素首次出现位置(indexOf返回首现索引,与当前index相等时才保留),适用于数字、字符串等原始类型,不支持对象数组,性能不如Set。

可以使用 filter 配合 indexOf 实现数组去重,核心思路是:**只保留当前元素第一次出现的位置(即 indexOf === 当前索引)**。
基本写法
对数组调用 filter,在回调中判断该元素在原数组中首次出现的下标是否等于当前遍历的下标:
const arr = [1, 2, 2, 3, 3, 4]; const unique = arr.filter((item, index) => arr.indexOf(item) === index); // 结果: [1, 2, 3, 4]
为什么这样能去重?
indexOf(item) 总是返回该值**第一次出现的位置**。当遍历到重复项的后续位置时,indexOf 返回的是更靠前的下标,不再等于当前 index,因此被过滤掉。
- 索引 0 →
arr.indexOf(1) === 0→ 保留 - 索引 1 →
arr.indexOf(2) === 1→ 保留(首次出现) - 索引 2 →
arr.indexOf(2) === 1≠ 2 → 舍弃 - 以此类推…
注意事项
这个方法适用于**原始类型(如数字、字符串)数组**,对对象数组无效,因为 indexOf 使用严格相等(===)比较,而对象引用不同即不等。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- 支持字符串、数字、布尔值、
null、undefined - 不支持嵌套对象或数组去重
- 性能上不如
Set(尤其大数据量),因每次调用indexOf都要从头遍历
替代方案(推荐)
现代开发中更常用且简洁的方式是:
// ES6+ 一行搞定(推荐) const unique = [...new Set(arr)]; // 或者用 reduce(兼容性稍好) const unique = arr.reduce((acc, item) => acc.includes(item) ? acc : [...acc, item], []);
但若需兼容老旧环境或必须用 filter + indexOf,上述写法完全可用。

















