Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
数组去重的多种方法_性能对比与适用场景分析_创想鸟

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

首选Set去重基础类型,代码简洁性能高;兼容旧环境用filter+indexOf;对象数组按字段去重推荐Set结合filter,高效且可扩展。

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

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

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 存储。

示例:

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 按字段过滤。方法不复杂,但选对才能兼顾效率与稳定。

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1540275.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
掌握React中useState的正确使用:解决变量不响应更新的问题
上一篇 2025年12月21日 12:19:05
MongoDB 日期范围查询:避免字符串陷阱与最佳实践
下一篇 2025年12月21日 12:19:10

相关推荐

  • C# .NET中基于JWT和外部授权服务器的REST API安全配置指南

    C# .NET中基于JWT和外部授权服务器的REST API安全配置指南C# .NET中基于JWT和外部授权服务器的REST API安全配置指南C# .NET中基于JWT和外部授权服务器的REST API安全配置指南C# .NET中基于JWT和外部授权服务器的REST API安全配置指南

    本文旨在提供一个简洁明了的教程,指导开发者如何在C# .NET应用中,以纯资源服务器模式,通过外部授权服务器(如AWS Cognito或Asgardeo)实现REST API的安全保护。文章将重点介绍如何利用JWT Bearer认证机制,通过最小化配置,快速构建一个能够验证传入访问令牌的API服务,…

    2026年9月27日 • 用户投稿
    000
  • Codename One:实现安全的数字密码输入框

    Codename One:实现安全的数字密码输入框Codename One:实现安全的数字密码输入框Codename One:实现安全的数字密码输入框Codename One:实现安全的数字密码输入框

    本文详细介绍了在Codename One中创建既能接受纯数字输入又能进行密码遮罩的文本输入框的方法。通过使用位或运算符(|)组合TextArea.NUMERIC和TextArea.PASSWORD约束,可以有效地实现这一需求,避免了链式调用constraint()的常见误区,从而提升用户体验和输入安…

    2026年9月27日 • 用户投稿
    000
  • Java Swing GUI:构建交互式逻辑门(AND门示例)

    Java Swing GUI:构建交互式逻辑门(AND门示例)Java Swing GUI:构建交互式逻辑门(AND门示例)Java Swing GUI:构建交互式逻辑门(AND门示例)Java Swing GUI:构建交互式逻辑门(AND门示例)

    本文详细介绍了如何使用Java Swing构建一个简单的AND逻辑门GUI应用。通过结合JCheckBox作为输入和JLabel作为视觉输出,并利用ChangeListener监听组件状态变化,实现当两个复选框都被选中时显示“绿色”,否则显示“红色”的功能。教程涵盖了组件创建、事件监听以及将自定义面…

    2026年9月27日 • 用户投稿
    100
  • 360极速浏览器收藏夹栏怎么显示_360极速浏览器显示或隐藏书签栏的方法

    360极速浏览器收藏夹栏怎么显示_360极速浏览器显示或隐藏书签栏的方法360极速浏览器收藏夹栏怎么显示_360极速浏览器显示或隐藏书签栏的方法360极速浏览器收藏夹栏怎么显示_360极速浏览器显示或隐藏书签栏的方法360极速浏览器收藏夹栏怎么显示_360极速浏览器显示或隐藏书签栏的方法

    360极速浏览器书签栏未显示时,可通过快捷键Ctrl+Shift+B切换,或在菜单“工具”中点击“显示书签栏”,也可在“设置-外观”中开启默认显示。 如果您希望在浏览网页时快速访问常用网站,但发现360极速浏览器的收藏夹栏未显示,可能是书签栏被隐藏了。以下是恢复显示书签栏的操作方法。 本文运行环境:…

    2026年9月27日 • 用户投稿
    100
  • uc浏览器如何开启阅读模式_UC浏览器网页纯净阅读模式使用方法

    uc浏览器如何开启阅读模式_UC浏览器网页纯净阅读模式使用方法uc浏览器如何开启阅读模式_UC浏览器网页纯净阅读模式使用方法uc浏览器如何开启阅读模式_UC浏览器网页纯净阅读模式使用方法uc浏览器如何开启阅读模式_UC浏览器网页纯净阅读模式使用方法

    开启UC浏览器阅读模式可去除广告并优化排版,具体操作包括:通过地址栏书本图标一键启用、从菜单手动开启,或在设置中开启自动进入功能,提升阅读体验。 如果您在浏览网页时希望减少广告和无关内容的干扰,可以启用UC浏览器的阅读模式来获得更清晰的阅读体验。该功能会自动提取网页正文并优化排版,使文字更加易读。 …

    2026年9月27日 • 用户投稿
    100
  • Java Swing 实现带复选框和图像的逻辑门

    Java Swing 实现带复选框和图像的逻辑门Java Swing 实现带复选框和图像的逻辑门Java Swing 实现带复选框和图像的逻辑门Java Swing 实现带复选框和图像的逻辑门

    本文介绍了如何使用 Java Swing 创建一个简单的 AND 逻辑门 GUI,该 GUI 包含两个复选框和一个图像。当两个复选框都被选中时,图像变为绿色;否则,图像变为红色。我们将使用 JCheckBox、JLabel 和 ChangeListener 来实现这一功能,并提供完整的代码示例。 创…

    2026年9月27日 • 用户投稿
    000
  • sublime怎么实现vim模式_sublime Vim模式配置教程

    sublime怎么实现vim模式_sublime Vim模式配置教程sublime怎么实现vim模式_sublime Vim模式配置教程sublime怎么实现vim模式_sublime Vim模式配置教程sublime怎么实现vim模式_sublime Vim模式配置教程

    启用Vintage模式可在Sublime Text中实现Vim操作:1. 在设置中移除”Ignored_packages”里的”Vintage”以激活;2. 按Esc进入命令模式,支持hjkl移动、dd删除、yy复制、p粘贴等快捷键;3. 可通过自定义…

    2026年9月27日 • 用户投稿
    100
  • 解决Spring REST API 406 Not Acceptable错误

    解决Spring REST API 406 Not Acceptable错误解决Spring REST API 406 Not Acceptable错误解决Spring REST API 406 Not Acceptable错误解决Spring REST API 406 Not Acceptable错误

    本文旨在帮助开发者解决在使用Spring REST API时遇到的“406 Not Acceptable”错误。该错误通常表示服务器无法找到客户端可接受的表示形式。我们将详细介绍错误的原因、解决方案,并通过示例代码演示如何配置produces属性来指定API的响应类型,确保客户端能够正确接收和处理数…

    2026年9月27日 • 用户投稿
    000
  • uc浏览器首页的新闻怎么关闭_UC浏览器关闭首页新闻资讯教程

    uc浏览器首页的新闻怎么关闭_UC浏览器关闭首页新闻资讯教程uc浏览器首页的新闻怎么关闭_UC浏览器关闭首页新闻资讯教程uc浏览器首页的新闻怎么关闭_UC浏览器关闭首页新闻资讯教程uc浏览器首页的新闻怎么关闭_UC浏览器关闭首页新闻资讯教程

    如果您在使用UC浏览器时,希望减少首页的新闻资讯干扰,以获得更专注的浏览体验,可以通过以下方法进行设置。 本文运行环境:小米14 Pro,Android 14 一、关闭资讯推送通知 此操作将阻止UC浏览器向您发送弹出式新闻提醒,从系统层面减少打扰。 1、打开手机上的UC浏览器应用。 2、点击屏幕右下…

    2026年9月27日 • 用户投稿
    000
  • 跨平台无纸化会议安装指南

    跨平台无纸化会议安装指南跨平台无纸化会议安装指南跨平台无纸化会议安装指南跨平台无纸化会议安装指南

    无纸化会议的投屏功能通常依赖于windows或安卓系统,但本文提供一种兼容多种操作系统的部署方案,实现跨平台应用。无论使用windows、安卓、ios还是mac设备,均可顺利安装并运行无纸化会议系统,显著提升会议的便捷性与协作效率。 1、 首先将无纸化会议服务器部署至机柜中,接通网络与电源,后续无需…

    2026年9月27日 • 用户投稿
    400
  • Java:子类如何在不修改父类的情况下,通过重写方法间接利用父类私有成员

    Java:子类如何在不修改父类的情况下,通过重写方法间接利用父类私有成员Java:子类如何在不修改父类的情况下,通过重写方法间接利用父类私有成员Java:子类如何在不修改父类的情况下,通过重写方法间接利用父类私有成员Java:子类如何在不修改父类的情况下,通过重写方法间接利用父类私有成员

    在Java中,当子类需要在不修改父类的前提下,利用父类的私有成员时,直接访问是不允许的。本教程将展示如何通过调用父类的公共或保护方法(例如super.toString()),来间接利用父类内部已处理过的私有数据,尤其适用于重写方法并在此基础上扩展功能的情景。 Java封装性与私有成员:理解限制 ja…

    2026年9月27日 • 用户投稿
    000
  • Java中HashMap基本使用方法

    HashMap是Java中基于哈希表实现的键值对存储结构,属于java.util包,允许null键和null值,不保证顺序;通过put()添加元素,get()获取值,支持containsKey、remove、size等操作,并可使用keySet、values、entrySet遍历;多线程环境下不安全…

    2026年9月27日
    000
  • HTML表单动态必填字段:基于其他字段内容的条件校验

    本文将指导您如何使用JavaScript实现HTML表单中字段的条件必填校验。当一个字段(如“姓名”)有值时,另一个字段(如“位置”)才变为必填项,从而提升用户体验和数据准确性。教程将提供详细的HTML和JavaScript代码示例,并解释其工作原理,确保您能轻松掌握这种实用的前端验证技术。 在构建…

    2026年9月27日
    100
  • 算法科普——运动学LMPC和动力学LMPC之间的区别与联系

    算法科普——运动学LMPC和动力学LMPC之间的区别与联系算法科普——运动学LMPC和动力学LMPC之间的区别与联系算法科普——运动学LMPC和动力学LMPC之间的区别与联系算法科普——运动学LMPC和动力学LMPC之间的区别与联系

    在上一期的算法科普中,我已经探讨了lmpc的发展历程。然而,上一期并未深入探讨lmpc的各种分支,因此本期将重点介绍两种运动学层面的lmpc控制器和一种动力学层面的lmpc控制器。 一种常见的运动学层面的LMPC控制器的预测模型是直接对运动学模型进行雅克比线性化处理,如[1]中所述: 另一种运动学层…

    2026年9月27日 • 用户投稿
    000
  • 2026年发售? 据曝《奇异人生:双重曝光》续作开发中

    2026年发售? 据曝《奇异人生:双重曝光》续作开发中2026年发售? 据曝《奇异人生:双重曝光》续作开发中2026年发售? 据曝《奇异人生:双重曝光》续作开发中2026年发售? 据曝《奇异人生:双重曝光》续作开发中

    据最新消息,史克威尔艾尼克斯(SE)正与Deck Nine Games携手推进《奇异人生:双重曝光》的续作开发工作,这款章节式叙事冒险游戏的新篇章已悄然进入制作阶段。 Deck Nine Games的首席动画师David Blanchette以及过场动画设计师Kyle Norlander,近期在他们…

    2026年9月27日 • 用户投稿
    400
  • 微软为PowerToys 键盘管理器开发新功能:可快捷启动应用 / 网站

    微软为PowerToys 键盘管理器开发新功能:可快捷启动应用 / 网站微软为PowerToys 键盘管理器开发新功能:可快捷启动应用 / 网站微软为PowerToys 键盘管理器开发新功能:可快捷启动应用 / 网站微软为PowerToys 键盘管理器开发新功能:可快捷启动应用 / 网站

    据国外科技媒体 deskmodder 的报道,微软正着手为“键盘管理器”(keyboard manager)工具添加全新功能。“键盘管理器”隶属于 powertoys 工具集,允许用户自定义全局及各应用程序内的键盘快捷键。微软计划扩展其功能,使用户能够通过自定义快捷键来启动程序,并设定程序启动时的状…

    2026年9月27日 • 用户投稿
    100
  • Java中高并发数据库同步与任务处理教程

    Java中高并发数据库同步与任务处理教程Java中高并发数据库同步与任务处理教程Java中高并发数据库同步与任务处理教程Java中高并发数据库同步与任务处理教程

    本文旨在探讨Java应用中处理高并发数据库操作的有效策略,尤其针对大量数据行的计算与状态更新场景。我们将介绍如何利用ExecutorService和任务对象实现并发处理,并通过数据库连接池优化资源管理。重点关注数据库层面的并发控制机制,如事务和行级锁,以确保数据一致性和系统性能,并提供实际的代码示例…

    2026年9月27日 • 用户投稿
    100
  • 360极速浏览器无法播放B站视频是什么原因_Bilibili视频播放失败排查方案

    360极速浏览器无法播放B站视频是什么原因_Bilibili视频播放失败排查方案360极速浏览器无法播放B站视频是什么原因_Bilibili视频播放失败排查方案360极速浏览器无法播放B站视频是什么原因_Bilibili视频播放失败排查方案360极速浏览器无法播放B站视频是什么原因_Bilibili视频播放失败排查方案

    若360极速浏览器播放B站视频黑屏或卡顿,可依次排查:1. 禁用HEVC硬件解码,强制使用AVC格式;2. 更新Widevine插件以支持DRM内容;3. 切换至兼容模式解决内核冲突;4. 清除缓存并重置浏览器设置。 如果您尝试在360极速浏览器中播放B站视频,但出现黑屏、卡顿或无法加载的情况,则可…

    2026年9月27日 • 用户投稿
    000
  • Java高并发数据库同步处理:高效任务调度与连接管理实践

    Java高并发数据库同步处理:高效任务调度与连接管理实践Java高并发数据库同步处理:高效任务调度与连接管理实践Java高并发数据库同步处理:高效任务调度与连接管理实践Java高并发数据库同步处理:高效任务调度与连接管理实践

    本文深入探讨了在Java应用中处理海量数据并发同步的策略。通过将数据库操作封装为独立任务,结合ExecutorService进行高效调度,并利用数据库连接池(如HikariCP)优化资源管理,同时强调了数据库层面事务和锁机制的重要性。文章提供了实现并发处理、标记已消费行以及确保系统高性能和数据一致性…

    2026年9月27日 • 用户投稿
    100
  • 告别繁琐构造函数:使用建造者模式优化Java对象创建

    告别繁琐构造函数:使用建造者模式优化Java对象创建告别繁琐构造函数:使用建造者模式优化Java对象创建告别繁琐构造函数:使用建造者模式优化Java对象创建告别繁琐构造函数:使用建造者模式优化Java对象创建

    本文针对Java中处理多个可选参数时,传统构造函数组合繁琐的问题,详细介绍了建造者模式(Builder Pattern)。该模式通过分阶段构建对象,避免了大量参数构造函数和重复组合,提升了代码的可读性和可维护性。文章将通过代码示例深入解析建造者模式的实现原理与优势,并提供实际应用指导。 传统构造函数…

    2026年9月27日 • 用户投稿
    200

发表回复

登录后才能评论
关注微信