保留数组中最后一次出现的重复元素,推荐反向遍历+set法:从末尾遍历,用set记录已见值,收集首次遇到的元素后反转结果;或先用map记录各值最后索引,再筛选索引匹配的元素。

要保留数组中最后一次出现的重复元素(即去重时保留每个值的最后一个位置),核心思路是反向遍历 + 记录已见元素,或利用 Map / 对象记录最后索引,再按顺序提取。
方法一:反向遍历 + Set(推荐,简洁高效)
从数组末尾开始遍历,用 Set 记录已遇到的值。只保留第一次遇到(即原数组中最后一次出现)的元素,然后反转结果恢复原始相对顺序。
function keepLastOccurrence(arr) {
const seen = new Set();
const result = [];
// 从后往前遍历
for (let i = arr.length - 1; i >= 0; i--) {
if (!seen.has(arr[i])) {
seen.add(arr[i]);
result.push(arr[i]);
}
}
return result.reverse(); // 恢复“最后出现”的自然顺序
}
<p>// 示例
const arr = [1, 2, 3, 2, 4, 1, 5];
console.log(keepLastOccurrence(arr)); // [3, 2, 4, 1, 5]
</p>
方法二:先记录最后索引,再按原顺序筛选
遍历一次获取每个值在数组中最后出现的索引,再遍历原数组,只保留索引等于“最后索引”的元素(需配合对象或 Map 存储)。
- 适合需要明确知道“哪个位置被保留”的场景
- 对引用类型(如对象)需序列化键名,否则无法作为对象 key
function keepLastOccurrenceByIndex(arr) {
const lastIndices = new Map();
// 第一遍:记录每个值最后出现的索引
arr.forEach((item, index) => {
lastIndices.set(item, index);
});
<p>// 第二遍:只保留索引匹配最后位置的元素
return arr.filter((item, index) => lastIndices.get(item) === index);
}
</p>
注意事项
-
基本类型(数字、字符串、布尔值)可直接用 Set 或 Map;引用类型(对象、数组)需额外处理(如用
JSON.stringify或自定义 key 生成逻辑),否则会被视为不同元素 - 如果数组含
NaN,Set和Map能正确识别(ES6+ 中NaN === NaN在 Set/Map 内部成立),但普通对象 key 会失败(obj[NaN] = 1实际转为obj["NaN"]) - 性能上,方法一时间复杂度 O(n),空间 O(n),通常更优;方法二也 O(n),但需两次遍历
一行式(仅限简单场景,可读性差)
不推荐生产使用,但可用于快速调试:
const keepLast = a => [...new Set(a.slice().reverse())].reverse();
⚠️ 注意:a.slice().reverse() 会改变原数组顺序,且对复杂值无效(Set 去重仍基于严格相等)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











