可用filter配合indexOf实现数组去重,即只保留当前元素首次出现位置的项;适用于基本类型,不适用对象等引用类型,NaN会被过滤,时间复杂度O(n²)。

可以用 filter 配合 indexOf 实现数组去重,核心思路是:**只保留当前元素第一次出现的位置(即 indexOf 返回的索引等于当前遍历索引)的项**。
基本写法
这是最简洁有效的实现方式:
const arr = [1, 2, 2, 3, 4, 4, 5]; const unique = arr.filter((item, index) => arr.indexOf(item) === index); // 结果:[1, 2, 3, 4, 5]
说明:
- filter 遍历每个元素,传入回调函数,接收 item 和它的 index;
- arr.indexOf(item) 总是返回该值在数组中**首次出现的索引**;
- 当前 index 等于首次出现的索引时,说明这是该值的“第一次出现”,保留;否则跳过。
适用范围和限制
这个方法适合处理以下情况:
- 数组元素是基本类型(如数字、字符串、布尔值),能被
indexOf正确比较; - 不适用于对象、数组等引用类型——因为
indexOf对对象比较的是引用地址,不是内容; - 对
NaN有特殊行为:indexOf(NaN)永远返回-1,所以NaN会被过滤掉(除非它恰好是第一个元素且index === 0); - 性能上,时间复杂度为 O(n²),大数据量时不如
Set方案高效。
对比更现代的写法
ES6+ 推荐用 Set,更简洁、高效、语义清晰:
const unique = [...new Set(arr)];
如果必须用 filter 且需兼容对象去重,就得配合其他逻辑(比如用 JSON.stringify 或自定义 key 生成),但那就不再是单纯靠 indexOf 能解决的了。
不复杂但容易忽略细节,关键就是理解 indexOf 返回的是“首次出现位置”这个特性。











