新闻中心

数组去重的多种方法_性能对比与适用场景分析

2025-12-03
浏览次数:
返回列表
首选Set去重基础类型,代码简洁性能高;兼容旧环境用filter+indexOf;对象数组按字段去重推荐Set结合filter,高效且可扩展。

数组去重的多种方法_性能对比与适用场景分析

在 J*aScript 开发中,数组去重是一个常见需求。不同的业务场景对性能和兼容性要求不同,因此选择合适的去重方法至关重要。本文将介绍多种数组去重方式,分析其原理、性能表现及适用场景。

1. 利用 Set 去重(推荐基础类型)

ES6 引入的 Set 数据结构天然支持唯一值,是目前最简洁高效的去重方式。

示例:
const unique = arr => [...new Set(arr)];
const arr = [1, 2, 2, 3, 4, 4, 5];
console.log(unique(arr)); // [1, 2, 3, 4, 5]

优点:代码简洁,性能优秀,适合基础类型(数字、字符串、布尔)去重。
缺点:无法处理对象等引用类型,NaN 会被保留一个(Set 认为 NaN 等于 NaN)。
? 适用场景:基础类型数组,现代浏览器环境。

2. 使用 filter + indexOf(兼容旧环境)

通过 filter 遍历数组,利用 indexOf 判断当前元素是否首次出现。

示例:
const unique = arr => arr.filter((item, index) => arr.indexOf(item) === index);

优点:兼容性好,支持 IE9+。
缺点:时间复杂度为 O(n²),大数据量下性能较差。
? 适用场景:小数据量、需兼容老浏览器的项目。

3. 使用 reduce + includes(逻辑清晰)

借助 reduce 构建新数组,每次判断元素是否已存在。

示例:
const unique = arr => arr.reduce((acc, cur) => {
  return acc.includes(cur) ? acc : [...acc, cur];
}, []);

优点:逻辑清晰,易于理解与扩展。
缺点:includes 同样是 O(n),整体复杂度 O(n²),性能一般。
? 适用场景:教学演示或需自定义去重逻辑时。

4. 利用对象键名去重(历史方案)

利用对象属性名不可重复的特性,将数组元素作为 key 存储。

eSiteGroup站群管理系统1.0.4 eSiteGroup站群管理系统1.0.4

eSiteGroup站群管理系统是基于eFramework低代码开发平台构建,是一款高度灵活、可扩展的智能化站群管理解决方案,全面支持SQL Server、SQLite、MySQL、Oracle等主流数据库,适配企业级高并发、轻量级本地化、云端分布式等多种部署场景。通过可视化建模与模块化设计,系统可实现多站点的快速搭建、跨平台协同管理及数据智能分析,满足政府、企业、教育机构等组织对多站点统一管控的

eSiteGroup站群管理系统1.0.4 0 查看详情 eSiteGroup站群管理系统1.0.4 示例:
const unique = arr => {
  const obj = {};
  return arr.filter(item => {
    return obj.hasOwnProperty(item) ? false : (obj[item] = true);
  });
};

⚠️ 注意:所有值都会被转为字符串,导致 1 和 '1' 被视为相同。
? 适用场景:仅用于纯字符串或数字且不区分类型的特殊情况,现已较少使用。

5. 处理对象数组去重(按指定字段)

当数组元素为对象时,需根据某个唯一字段(如 id)进行去重。

示例:
const uniqueBy = (arr, key) => {
  const seen = new Set();
  return arr.filter(item => {
    const val = item[key];
    if (seen.has(val)) {
      return false;
    }
    seen.add(val);
    return true;
  });
};

优点:高效,可扩展性强。
? 适用场景:接口返回的列表数据去重,如用户列表按 userId 去重。

6. 性能对比简析

在 10万 条随机整数测试中:

  • Set 方式:约 10-20ms,最快
  • reduce + includes / filter + indexOf:超过 1000ms,明显变慢
  • 对象键名方式:约 100ms,中等但有类型隐患

Set 借助哈希表实现,查找时间接近 O(1),远优于遍历类方法。

基本上就这些。简单去重首选 Set;兼容老环境可用 indexOf;对象数组则结合 Set 按字段过滤。方法不复杂,但选对才能兼顾效率与稳定。

以上就是数组去重的多种方法_性能对比与适用场景分析的详细内容,更多请关注其它相关文章!


# 相关文章  # 玄武区网站建设公司电话  # 茂名公司seo优化  # seo优化标签属性  # 高邑企业网站推广报价公示  # 青海提供网站建设热线  # 贵州seo推广商家  # 哈尔滨百度seo算法  # 苏州抖音seo怎么合作  # 湖北网站推广有哪些渠道  # 网站推广百度百科  # 布尔  # 中文网  # javascript  # 键名  # 首次  # 是一个  # 用户发送  # 遍历  # 数据结构  # 管理系统  # red  # 浏览器  # 大数据  # java  # es6 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: C++指针和引用有什么区别_C++内存管理核心概念深度解析  C++如何解决segmentation fault_C++段错误调试与原因分析  蛙漫2日版入口 WAMAN2(日版)无删减漫画官网链接  PHP高效扁平化嵌套数组:使用array_merge与数组解包操作符  Mac终端命令大全_Mac常用Terminal指令速查  steam官方入口大全 steam账号注册及操作指南  Pandas DataFrame 高效批量赋值:告别循环与笛卡尔积误区  照顾宝贝2小游戏点击立即在线玩  抖音未来赚钱的新趋势 2025年值得关注的变现风口分析  移动端XML文件怎么转换成Excel 手机和平板上的解决方案  星露谷物语官网入口 星露谷物语游戏官网入口  Word2013如何插入视频和音频媒体_Word2013媒体插入的多媒体支持  天猫2025双十一0点秒杀攻略 天猫爆款抢购时间  ACG动漫视频网入口 ACG动漫*免费正版观看地址  J*a里如何实现订单支付与库存同步功能_支付库存同步项目开发方法说明  Sublime Text怎么显示空格和制表符_Sublime显示不可见字符设置  uc手机浏览器网页版入口 uc浏览器手机版便捷登录首页  如何使用CaptainHook和Composer管理Git钩子_在提交前自动运行代码检查的Composer配置  PHP中获取MongoDB服务器运行时间(Uptime)的专业指南  Lar*el 递归关系中排除指定分支的教程  从OpenAI API响应中高效提取生成文本  支付宝如何管理隐私设置_支付宝隐私保护的配置技巧  C++如何实现一个装饰器模式_C++设计模式之动态地给对象添加额外职责  Win11怎么开启卓越性能模式 Win11电源选项启用高性能释放硬件潜力【方法】  HuggingFaceEmbeddings中向量嵌入维度调整的限制与理解  Win11怎么关闭触摸屏_Windows 11禁用HID符合标准触摸屏  文本文档写html代码怎么运行_文本文档html代码运行步骤【教程】  J*aScript中向JSON对象添加新属性的正确姿势  免费抖音短视频入口_抖音网页版短视频免费通道  2026春节假期时间安排 2026春节假日查询  mcjs网页版在线存档 mcjs云存档登录入口  J*aScriptWebpack优化_J*aScript构建工具实战  汽水音乐车机版8.9下载 汽水音乐车机版8.9版本安装入口  在J*a里如何理解依赖关系的方向_依赖方向在模块结构中的作用  最新韩小圈网页版登录入口_官网在线观看官方链接  解决Flask中Quill编辑器内容提交失败及TypeError的指南  AO3中文官网链接_AO3网页版稳定镜像站  解决Rails应用中内容错位与Turbo警告:meta标签误用导致富文本渲染异常  新三国志曹操传110级星符试炼夏侯渊极难攻略  漫蛙2网页版漫画入口 漫蛙漫画在线官方登录  腾讯QQ邮箱登录入口_QQ邮箱官方网站使用地址  c++如何实现单例设计模式_c++线程安全的单例模式写法  Win11怎么修改默认浏览器_Windows 11设置Chrome为默认  Python异步编程实践:使用Binance API构建实时交易数据流  J*a最大堆Heapify方法修复:索引计算与边界条件深度解析  QQ邮箱官网登录入口 QQ邮箱网页版邮箱快速登录  CSS Flexbox如何实现多行排列_flex-wrap wrap自动换行显示  MAC怎么安装Homebrew包管理器_MAC为开发者和高级用户安装命令行工具  不会效仿卡普空!《铁拳》制作人澄清:不采取赛事付费|直播|  微信语音通话掉线如何解决 微信语音通话稳定优化方法 

搜索