最简洁可靠的方式是使用 Set 配合扩展运算符:const uniqueArr = [...new Set(arr)];基本类型可直接用 Set,对象数组需按字段(如 id)结合 filter 或 findIndex 去重,Set 对 NaN 有特殊处理而 indexOf 不能识别 NaN。

JavaScript 中实现数组去重并保持原有顺序,最简洁可靠的方式是使用 Set 配合扩展运算符,一行代码即可完成:
用 Set + 扩展运算符(推荐)
Set 会自动去除重复值,且按插入顺序保存元素,因此转回数组后天然保持原顺序。
示例:
const arr = [1, 2, 2, 3, 1, 4];const uniqueArr = [...new Set(arr)]; // [1, 2, 3, 4]
用 filter + indexOf(兼容旧环境)
适用于需要支持 IE 等不支持 Set 的场景。原理是只保留第一次出现的元素。
立即学习“Java免费学习笔记(深入)”;
说明:每个元素调用 indexOf 查找其首次出现位置,若当前索引等于首次索引,就保留。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
示例:
const arr = [1, 2, 2, 3, 1, 4];const uniqueArr = arr.filter((item, index) => arr.indexOf(item) === index); // [1, 2, 3, 4]
处理对象数组(按某个字段去重)
原生 Set 无法直接判断对象是否重复,需手动提取唯一标识(如 id),再结合 filter 或 reduce 实现。
常见做法:
- 用
Map缓存已见的 key,遍历时跳过重复项 - 用
filter搭配findIndex判断是否为首次出现
示例(按 id 去重):
const uniqueUsers = users.filter((user, index, self) =>
self.findIndex(u => u.id === user.id) === index
); // [{id: 1, name: 'a'}, {id: 2, name: 'b'}]
注意事项
去重逻辑依赖数据类型:
- 基本类型(数字、字符串等)可直接用
Set - 引用类型(对象、数组)需明确“重复”的定义(如字段相等),不能直接用
Set去重 - 若数组含
NaN,Set能正确去重(NaN === NaN为false,但Set内部特殊处理使其唯一);而indexOf无法识别NaN,慎用

















