用indexOf配合filter去重的核心是只保留首次出现索引等于当前遍历索引的元素,适用于原始值;但对象等引用类型不适用,且时间复杂度为O(n²)。

用 indexOf 配合 filter 实现数组去重,核心思路是:**只保留当前元素在原数组中第一次出现的位置(即索引)等于它当前遍历位置的那些项**。这能天然过滤掉重复值。
原理:利用 indexOf 返回首次匹配索引
arr.indexOf(item) 总是返回该 item 在数组中**第一次出现的下标**。如果当前遍历到的元素 item 的首次出现位置恰好等于它此刻的索引 i,说明它是“首次露面”;否则就是重复项。
基础写法(适用于简单类型)
对数字、字符串等原始值数组最直接:
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
const arr = [1, 2, 2, 3, 4, 4, 5]; const unique = arr.filter((item, i) => arr.indexOf(item) === i); // → [1, 2, 3, 4, 5]
注意事项和局限性
-
仅适用于原始值:对象、数组等引用类型会因内存地址不同导致
indexOf始终返回 -1,无法正确去重 -
时间复杂度较高:
filter遍历一次,每次调用indexOf又可能遍历一次,整体接近 O(n²),大数据量时不推荐 - 不改变原数组:返回新数组,符合函数式习惯
简单扩展:忽略大小写去重字符串
若需忽略大小写,可统一转小写再比索引:
const words = ['Apple', 'banana', 'apple', 'Cherry', 'BANANA']; const uniqueIgnoreCase = words.filter( (item, i) => words.findIndex(w => w.toLowerCase() === item.toLowerCase()) === i ); // → ['Apple', 'banana', 'Cherry']
这里用 findIndex 更清晰,因为 indexOf 对字符串不支持回调,但逻辑一致。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










