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
<p>✅ 原理清晰、兼容性好(支持 IE9+),适合小数组或教学场景。</p><div class="aritcle_card flexRow artxards">
<div class="artcardd flexRow">
<a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill6235" title="Java Maven Code Review"><img
src="https://img.php.cn/upload/skill/000/000/081/179084711841712.jpg" alt="Java Maven Code Review" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a rel="nofollow" href="/xiazai/skill6235" title="Java Maven Code Review" class="overflowclass">Java Maven Code Review</a>
<p class="overflowclass">审查Java Maven项目(ZIP压缩包或GitLab仓库URL),检查代码规范、命名、模块边界、可维护性问题以及重复代码。</p>
</div>
<a rel="nofollow" href="/xiazai/skill6235" title="Java Maven Code Review" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
</a>
</div>
</div>
<h3>注意:indexOf 对象/数组等引用类型无效</h3>
<p>如果数组里是对象、数组或函数,indexOf 使用的是严格相等(===)比较,而两个字面量对象永远不相等:</p>
<pre class="brush:php;toolbar:false;">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))。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










