indexOf不能直接去重,但可配合循环判断元素是否已存在来实现;适用于基本类型,对对象等引用类型失效,因比较的是内存地址而非内容。

indexOf 本身不能直接“排除重复”,但它可以用来判断某个元素是否已存在,从而配合循环实现去重。 常见做法是遍历原数组,对每个元素检查它在新数组中是否已出现(用 indexOf 判断),没出现才推入新数组。
基础写法:for 循环 + indexOf
这是最直观、兼容性最好的方式,适合理解原理或需支持旧浏览器的场景:
const arr = [1, 2, 2, 3, 4, 4, 5];
const unique = [];
for (let i = 0; i < arr.length; i++) {
if (unique.indexOf(arr[i]) === -1) {
unique.push(arr[i]);
}
}
// unique → [1, 2, 3, 4, 5]
-
indexOf返回首次匹配的索引;没找到返回-1 - 只在
unique中不存在该值时才添加,自然跳过重复项 - 保持原始顺序,且不修改原数组
用 filter + indexOf 实现一行去重(仅适用于简单类型)
利用 filter 的回调函数接收三个参数(当前值、索引、原数组),结合 indexOf 判断“当前值第一次出现的位置是否等于当前遍历位置”:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
const arr = [1, 2, 2, 3, 4, 4, 5]; const unique = arr.filter((item, index) => arr.indexOf(item) === index); // unique → [1, 2, 3, 4, 5]
- 原理:如果
item在整个数组中首次出现的位置就是index,说明它是“第一次被遇到”的那个,保留;否则是重复项,过滤掉 - 简洁但有性能开销(每次调用
indexOf都要从头扫描) - 只适用于字符串、数字等基本类型;对象、数组等引用类型会失效(因
indexOf比较的是引用,不是内容)
注意:indexOf 无法处理对象/嵌套数据
下面代码不会按预期去重:
立即学习“Java免费学习笔记(深入)”;
const arr = [{id: 1}, {id: 1}, {id: 2}];
const unique = arr.filter((item, index) => arr.indexOf(item) === index);
// 结果仍是 [{id: 1}, {id: 1}, {id: 2}] —— 因为两个对象引用不同
-
indexOf对对象使用的是严格相等(===),只认同一内存地址 - 如需对象去重,应基于某个字段(如
id)判断,可用findIndex或some配合属性比较 - 例如:
unique.findIndex(x => x.id === item.id) === -1
现代替代方案(推荐用于新项目)
虽然问题聚焦 indexOf,但实际开发中更推荐语义清晰、性能更好的方法:
-
[...new Set(arr)]:最简写法,适合基本类型,自动去重并保持顺序 -
arr.reduce((acc, cur) => acc.includes(cur) ? acc : [...acc, cur], []):可读性略差,性能不如 Set - 对象去重建议用
Map或reduce+ 辅助键(如JSON.stringify或自定义 key)

















