新闻中心
J*aScript数组去重的十种高效方法_j*ascript技巧
使用Set去重最简洁高效,适用于基本类型;2. filter+indexOf兼容性好但性能较差;3. forEach+Object利用键值记录,需注意类型转换问题;4. Map方式更安全可靠,支持任意键类型;5. reduce函数式风格清晰但性能一般;6. 排序后比较节省空间但改变顺序;7. JSON.stringify用于对象数组去重但有局限性;8. 根据属性如id去重最常用且灵活;9. 双重循环适合理解原理但效率低;10. 利用Symbol或WeakMap可实现更高级去重。

J*aScript数组去重是开发中常见的需求,尤其在处理用户输入、接口返回数据或集合操作时。下面介绍十种高效且实用的数组去重方法,涵盖基础类型与引用类型的不同场景,帮助你在不同情况下选择最合适的方式。
1. 使用 Set 去重(最简洁)
ES6 引入的 Set 数据结构自动保证元素唯一性,结合扩展运算符可快速实现去重。
const unique = [...new Set(arr)];适用于基本类型(number、string、boolean),代码最短,性能优秀。
2. filter + indexOf(兼容性好)
利用 indexOf 返回第一个匹配项的索引,判断当前项是否首次出现。
arr.filter((item, index) => arr.indexOf(item) === index);适合老浏览器环境,但对长数组性能较差,因 indexOf 是 O(n) 操作。
3. forEach + Object 键值去重(适合基本类型)
使用普通对象作为哈希表记录已出现的值。
let obj = {};let result = [];
arr.forEach(item => {
if (!obj[item]) {
obj[item] = true;
result.push(item);
}
});
注意:item 为数字或字符串时有效,true 和 '1' 可能冲突,需谨慎处理类型。
4. Map 记录唯一值(推荐用于复杂判断)
Map 支持任意类型键值,比 Object 更安全。
const map = new Map();const result = [];
arr.forEach(item => {
if (!map.has(item)) {
map.set(item, true);
result.push(item);
}
});
比 Object 方式更可靠,尤其在涉及多种数据类型时。
5. reduce 实现去重(函数式风格)
使用 reduce 累积唯一值。
arr.reduce((acc, cur) => {if (!acc.includes(cur)) acc.push(cur);
return acc;
}, []);
代码清晰,但 includes 遍历导致性能一般,适合小数组。

6. 排序后相邻比较(节省空间)
先排序,再比较相邻元素。
BrandCrowd
一个在线Logo免费设计生成器
200
查看详情
arr.slice()
.sort()
.filter((item, index, array) => index === 0 || item !== array[index - 1]);
修改了顺序,不适合要求保持原序的场景,但空间利用率高。
7. 去重对象数组:JSON.stringify + Set
对对象数组可通过序列化判断是否重复。
[...new Set(arr.map(JSON.stringify))].map(JSON.parse);简单粗暴,但属性顺序影响结果,且含函数或 undefined 会失败,慎用。
8. 根据对象特定属性去重
例如根据 id 去除重复对象。
const seen = new Set();arr.filter(item => {
if (seen.has(item.id)) return false;
seen.add(item.id);
return true;
});
实际项目中最常用方式之一,灵活可控。
9. 双重循环 + 标志位(手动控制)
传统方式,适合学习理解原理。
let result = [];for (let i = 0; i let isDuplicate = false;
for (let j = 0; j if (arr[i] === result[j]) {
isDuplicate = true;
break;
}
}
if (!isDuplicate) result.push(arr[i]);
}
时间复杂度高,仅建议用于极小数据集或教学。
10. 利用 Proxy 中间拦截(高级技巧)
可在数据写入过程中实时去重。
const uniqueArray = new Proxy([], {set(target, property, value) {
if (target.includes(value)) return true;
target[property] = value;
return true;
}
});
属于进阶用法,适合需要动态拦截赋值的场景。
基本上就这些。选择哪种方法取决于你的数据类型、性能要求和浏览器支持。多数情况下,Set 是首选方案,简洁高效;对象数组则推荐基于属性的 Map 过滤。不复杂但容易忽略的是数据类型的兼容性和原始顺序的保持。
以上就是J*aScript数组去重的十种高效方法_j*ascript技巧的详细内容,更多请关注其它相关文章!
# 如何用
# 建设工程扣分查询网站
# 黄山网络营销推广哪家好
# 南宫哪里有网站建设列表
# 固始网站建设报价
# 青龙满族自治县网站推广
# seo关键词排名推荐火星系统
# 速卖通seo方法
# 免费seo霸屏推广
# 河南抖音seo怎样收费
# inside seo
# 如何实现
# 性好
# 最常用
# javascript
# 命令行
# 运算符
# 适用于
# 键值
# 数据结构
# 十种
# red
# proxy
# 浏览器
# json
# js
# java
# es6
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
Golang如何优雅处理error_Golang error处理最佳实践总结
Safari自带网页翻译功能怎么用 无需插件轻松看懂外文网站【方法】
如何提高微信支付的安全性_微信支付安全防护与设置建议
UE5.7引擎表现爆炸优化无敌!5090跑4K稳定60FPS
解决 MongoDB 聚合查询中对象数组 _id 匹配问题
漫蛙漫画登录站点 漫蛙2正版漫画快速访问
React/Next.js中实现列表项的动态移动与状态管理:兼论唯一键的重要性
age动漫网站入口 age动漫官网直接访问入口
C++指针和引用有什么区别_C++内存管理核心概念深度解析
机器学习中对数变换预测结果的反向还原
如何高效处理PHP中的Excel数据导入导出?PortPHP/Spreadsheet助你轻松搞定!
Lar*el DB::listen 事件中的查询执行时间单位解析
海棠电脑版入口_通过电脑访问海棠官网阅读
邮政编码查询不到怎么办_邮政编码查询不到的常见原因与对策
解决Tabulator日期时间排序问题的专业指南
C++的std::forward_list怎么用_C++ STL中单向链表容器的特点与应用
知音漫客正版漫画平台_知音漫客官网账号登录
sublime怎么覆盖插件的默认快捷键_sublime快捷键优先级与设置
如何将一个大型PHP应用拆分为多个Composer包_微服务与模块化架构的Composer实践
百度浏览器字体显示异常偏小_百度浏览器字体渲染修复方案
Word2013如何插入视频和音频媒体_Word2013媒体插入的多媒体支持
微信聊天记录怎么加密_微信聊天记录加密方法
QQ邮箱官方网页版登录 QQ邮箱个人邮箱快速访问
高德地图总提示网络异常怎么办 高德地图离线导航设置与网络排查方法
React列表渲染与独立状态管理:避免全局状态影响局部更新
整合Supabase认证与Django模型:跨模式迁移的解决方案
Bilibili动漫最新防封地址发布-Bilibili动漫2025年最稳正版入口推荐
Go语言中JSON数据解析与字段访问教程
win11 Snap Layouts怎么用 Win11窗口布局与分屏多任务高效指南【必学】
qq游戏免费畅玩入口_qq游戏电脑版快速启动
Lar*el Form Request中唯一性验证在更新操作中的正确实现
MAC如何安全彻底地删除文件_MAC使用终端命令确保文件无法被恢复
创客贴用户入口官网登录 创客贴网页版电脑版系统
机构:以往存储涨价周期小米利润率实际上有所改善 能转嫁给消费者等
msn官网入口地址手机版 msn官方网站手机最新链接
怎样使用“本地安全策略”提升Windows安全性_Secpol.msc配置指南【高手】
Basecamp怎样用留言钉固定重点_Basecamp用留言钉固定重点【重点标记】
Gmail邮箱申请注册直达_Gmail邮箱免费注册PC版官网入口2025
LINQ to XML为何解析失败? 深入理解C# XDocument的异常处理
必由学官方网站入口 必由学学生教师共用登录通道
Python:递归比较文件夹内容并找出特定类型文件的差异
Spring Boot内嵌服务器与J*a EE全栈特性:选择与部署策略
php源码怎么在电脑上测试_电脑测试php源码方法步骤【教程】
jQuery Mask 插件中实现电话号码固定前导零的教程
qq邮箱日历功能怎么用_创建日程与会议邀请的技巧
在VS Code中配置和运行Dart程序的完整步骤
c++如何使用折叠表达式(Fold Expressions)_c++17可变参数模板新技巧
PostgreSQL海量数据高效导入策略:Python与Django实践指南
Shopware订单对象中获取产品自定义字段的正确方法
利用5118提升短视频内容效果_5118短视频关键词优化方法


2025-11-06
浏览次数:次
返回列表