可利用filter结合indexOf实现数组去重,原理是保留首次出现的元素,时间复杂度O(n²),适用于小规模基础类型数组,但对NaN和对象无效。

可以利用 filter 遍历数组,再用 indexOf 判断当前元素是否为该值首次出现的位置,从而保留唯一项。这是一种简洁、易懂的去重方式,时间复杂度为 O(n²),适合小规模数据或教学演示。
核心逻辑:只保留第一次出现的元素
indexOf 返回元素在数组中**首次出现的索引**。如果当前遍历到的索引 i 等于 arr.indexOf(arr[i]),说明这是该值第一次出现,应保留;否则跳过。
-
filter的回调函数接收三个参数:item(当前元素)、index(当前索引)、array(原数组) - 关键判断是:
array.indexOf(item) === index - 这个条件天然保证了重复元素中只有第一个满足,后续重复项的
indexOf值会小于当前index
代码实现(一行可写完)
示例:
const arr = [1, 2, 2, 3, 3, 4]; const unique = arr.filter((item, index) => arr.indexOf(item) === index); // → [1, 2, 3, 4]
注意:该方法对 NaN 和对象等引用类型无效(因为 indexOf 使用严格相等 === 判断,而 NaN !== NaN,且不同对象即使内容相同也视为不等)。
为什么是 O(n²)?
外层 filter 遍历 n 次,每次调用 indexOf 最坏需再扫描 n 个元素(例如找最后一个元素),所以总操作数约为 n × n,即 O(n²)。相比 Set 去重(O(n)),它效率较低,但无需额外数据结构,语义清晰。
适用场景与注意事项
- 适合处理几百以内整数/字符串等基础类型的小数组
- 不适用于含
NaN、undefined(虽能保留一个,但逻辑易混淆)、对象或函数的数组 - 原数组顺序会被保留(稳定去重)
- 若需兼容
NaN,可改用includes+ 记录已见集合,但那就不再是纯indexOf方案了

















