保留最后出现的重复项需从后往前处理:方法一用reverse+Set+reverse;方法二用lastIndexOf判断是否末次出现;方法三用Map记录最后索引再提取。

要保留最后出现的重复项元素,核心思路是**从后往前遍历,记录已见过的元素,跳过前面重复的**。和常规去重(保留首次)相反,这里需要逆序处理或用 Map/对象记录最后索引。
方法一:reverse + filter + reverse(简洁易懂)
先反转数组,用常规“保留首次”去重(如 Set 或 indexOf),再反转回来。适合中小型数组,代码清晰。
- 利用 Set 去重(保留反转后的首次,即原数组的末次):
const unique = [...new Set(arr.reverse())].reverse();
// → [3, 2, 4, 1, 5]
方法二:用 lastIndexOf 配合 filter(不修改原数组)
对每个元素,检查它在原数组中最后一次出现的位置是否等于当前索引。只有“最后一次出现”的元素才被保留。
- 高效、语义明确,无需额外数据结构:
const unique = arr.filter((item, index) => arr.lastIndexOf(item) === index);
// → [3, 2, 4, 1, 5]
方法三:Map 记录最后索引(适合大数组或需兼容旧环境)
先遍历一次,用 Map 存储每个值对应的最后出现索引;再按索引顺序提取——可严格保持最后出现的顺序(注意:lastIndexOf 方法天然保持顺序,此法更可控)。
- 适用于需要显式控制顺序或后续扩展逻辑的场景:
const map = new Map();
arr.forEach((item, index) => map.set(item, index));
const unique = [...map.keys()].map(key => arr[map.get(key)]);
// → [3, 2, 4, 1, 5]
注意事项
所有方法均基于“值相等”判断(===),对引用类型(如对象、数组)无效。若需深比较去重,需额外实现逻辑,且无法仅靠“最后出现”简单定义——因为对象引用不同即视为不同元素。


















