JavaScript 数组去重的几种方法:从基础到高级!

在前端开发中,数组去重是一个常见的需求。今天我们就来聊聊 JavaScript 中几种常用的数组去重方法,从最简单的到最高效的,帮你彻底掌握这个技能!


数组去重的几种方法

1. 使用 Set 去重

Set 是 ES6 引入的一种数据结构,它天然具有去重的特性。

示例代码

ini 复制代码
const arr = [1, 2, 2, 3, 4, 4, 5];
const uniqueArr = [...new Set(arr)];
console.log(uniqueArr); // 输出:[1, 2, 3, 4, 5]

优点 :代码简洁,性能较好。
缺点:无法处理对象类型的元素。


2. 使用 filter indexOf

通过 filterindexOf 结合,筛选出第一次出现的元素。

示例代码

ini 复制代码
const arr = [1, 2, 2, 3, 4, 4, 5];
const uniqueArr = arr.filter((item, index) => arr.indexOf(item) === index);
console.log(uniqueArr); // 输出:[1, 2, 3, 4, 5]

优点 :兼容性好,支持旧版浏览器。
缺点:性能较差,时间复杂度为 O(n²)。


3. 使用 reduce includes

通过 reduce 遍历数组,结合 includes 判断是否已存在。

示例代码

ini 复制代码
const arr = [1, 2, 2, 3, 4, 4, 5];
const uniqueArr = arr.reduce((acc, item) => {
  if (!acc.includes(item)) acc.push(item);
  return acc;
}, []);
console.log(uniqueArr); // 输出:[1, 2, 3, 4, 5]

优点 :代码清晰,易于理解。
缺点:性能较差,时间复杂度为 O(n²)。


4. 使用 forEach 和对象属性

利用对象的属性名不可重复的特性,实现去重。

示例代码

ini 复制代码
const arr = [1, 2, 2, 3, 4, 4, 5];
const uniqueArr = [];
const temp = {};

arr.forEach(item => {
  if (!temp[item]) {
    temp[item] = true;
    uniqueArr.push(item);
  }
});
console.log(uniqueArr); // 输出:[1, 2, 3, 4, 5]

优点 :性能较好,时间复杂度为 O(n)。
缺点:无法处理对象类型的元素。


5. 使用 Map 去重

Map 是 ES6 引入的另一种数据结构,可以存储键值对,且键名不可重复。

示例代码

ini 复制代码
const arr = [1, 2, 2, 3, 4, 4, 5];
const uniqueArr = [];
const map = new Map();

arr.forEach(item => {
  if (!map.has(item)) {
    map.set(item, true);
    uniqueArr.push(item);
  }
});
console.log(uniqueArr); // 输出:[1, 2, 3, 4, 5]

优点 :性能较好,支持对象类型的元素。
缺点:代码稍复杂。


6. 使用 lodash

lodash 是一个流行的 JavaScript 工具库,提供了 uniq 方法用于数组去重。

示例代码

ini 复制代码
const _ = require('lodash');
const arr = [1, 2, 2, 3, 4, 4, 5];
const uniqueArr = _.uniq(arr);
console.log(uniqueArr); // 输出:[1, 2, 3, 4, 5]

优点 :代码简洁,功能强大。
缺点:需要引入第三方库。


总结

方法 优点 缺点
Set 代码简洁,性能较好 无法处理对象类型的元素
filter indexOf 兼容性好 性能较差
reduce includes 代码清晰 性能较差
forEach + 对象属性 性能较好 无法处理对象类型的元素
Map 性能较好,支持对象类型 代码稍复杂
lodash 代码简洁,功能强大 需要引入第三方库

相关推荐
朝阳393 分钟前
react19【实战】配置化路由登录鉴权完整方案
前端·javascript·react.js
其美杰布-富贵-李13 分钟前
Vue Router 实战教程
前端·javascript·vue.js
NutShell Wang16 分钟前
拆解 GitHub gh-stack:堆叠 PR 工作流的设计取舍与工程实现
前端·git·开源·github·代码复审·开发者工具·vibe coding
名字还没想好☜20 分钟前
React 用 IntersectionObserver 实现图片懒加载与无限滚动:封装一个 useInView Hook
前端·javascript·vue.js·react.js·react
Sam_Deep_Thinking20 分钟前
用Java 17从0到1写一个mini版RPC,理解远程调用的本质
java·面试·rpc·程序员·系统架构
带娃的IT创业者1 小时前
Puppeteer 深度解析:超越自动化测试的现代 Web 交互范式
前端·交互·puppeteer·可观测性·浏览器自动化·无头浏览器·web工程化
程序员爱钓鱼1 小时前
Rust 所有权 Ownership 详解:理解内存安全的核心机制
前端·后端·rust
Mh9 小时前
别再只会 `find` 了:Map 在前端业务里的真实用法
前端·javascript
陈随易10 小时前
FFmpeg 9.0 发布,代号 Lei,音视频处理再升级
前端·后端·程序员
爱丶狸10 小时前
Grafana_Zabbix_ImageRenderer_部署与前端操作手册
linux·前端·zabbix·grafana·kylin