indexOf 不能直接剔除重复项,仅返回元素首次出现的索引;去重需结合循环或filter等手动实现,如arr.filter((item, i) => arr.indexOf(item) === i)。

indexOf 本身不能直接剔除重复项,它只是查找元素首次出现的位置;要剔除重复,需配合循环或数组方法手动实现去重逻辑。
理解 indexOf 的作用
indexOf 返回指定元素在数组中第一次出现的索引,没找到则返回 -1。它不修改原数组,也不处理“重复”这个概念——它只回答“这个值第一次在哪”。所以剔除重复必须靠你控制遍历和筛选过程。
用 indexOf 实现简单去重(保留首次出现)
核心思路:遍历原数组,对每个元素检查 它在原数组中第一次出现的位置是否等于当前下标。如果是,说明这是它首次出现,保留;否则跳过。
- 代码示例:
const arr = [1, 2, 2, 3, 3, 4];
const unique = [];
for (let i = 0; i < arr.length; i++) {
if (arr.indexOf(arr[i]) === i) {
unique.push(arr[i]);
}
}
// unique → [1, 2, 3, 4]
✅ 原理清晰、兼容性好(支持 IE9+),适合小数组或教学场景。
立即学习“Java免费学习笔记(深入)”;
注意:indexOf 对象/数组等引用类型无效
如果数组里是对象、数组或函数,indexOf 使用的是严格相等(===)比较,而两个字面量对象永远不相等:
const arr = [{a:1}, {a:1}];
console.log(arr.indexOf({a:1})); // -1 —— 即使结构相同,也是不同引用
此时不能依赖 indexOf 去重。应改用 JSON.stringify 转字符串比对(仅限简单可序列化对象),或用 findIndex + 自定义判断,或用 Map/Set 配合键提取逻辑。
更现代、推荐的替代方案
虽然题目问 indexOf,但实际开发中更简洁安全的方式是:
-
Set 快速去重(基础类型):
[...new Set(arr)] -
filter + indexOf(一行写法,同上逻辑):
arr.filter((item, i) => arr.indexOf(item) === i) -
对象数组去重(按某字段):用
reduce或filter+some判断 id 是否已存在
这些方法语义更明确,性能也更容易预估(尤其是 Set 是 O(n))。


















