JavaScript 数组唯一元素提取:利用 indexOf 和 lastIndexOf 精准去重

JavaScript 数组唯一元素提取:利用 indexOf 和 lastIndexOf 精准去重

本教程将详细介绍如何利用 JavaScript 中数组的 indexOf() 和 lastIndexOf() 方法,结合 filter() 函数,高效地从一个数组中筛选出所有只出现一次的唯一元素。文章通过代码示例和逐步解析,帮助读者深入理解该方法的原理和应用,实现精确的去重操作。

数组唯一元素提取的需求

在日常的 javascript 开发中,我们经常会遇到需要处理数组中重复数据的情况。有时,我们不仅需要移除所有重复项以获得一个不包含任何重复值的数组(即去重),更具体的需求是,我们希望从数组中找出那些只出现过一次的元素,而将所有出现多次的元素全部剔除。例如,给定数组 [100, 123, 100, 122, 119, 203, 123, 76, 89],我们期望的输出是 [122, 119, 203, 76, 89]。

核心原理:indexOf() 与 lastIndexOf() 的结合应用

解决上述问题的关键在于巧妙地利用 JavaScript 数组的两个原生方法:Array.prototype.indexOf() 和 Array.prototype.lastIndexOf()。

indexOf(searchElement[, fromIndex]): 该方法返回在数组中可以找到一个给定元素的第一个(最小)索引,如果不存在,则返回 -1。它从数组的开头(索引0)开始向后查找。lastIndexOf(searchElement[, fromIndex]): 该方法返回在数组中可以找到一个给定元素的最后一个(最大)索引,如果不存在,则返回 -1。它从数组的末尾开始向前查找。

当一个元素在数组中只出现一次时,它的 indexOf() 和 lastIndexOf() 返回的索引值将是相同的。因为无论是从左侧查找还是从右侧查找,它都只会找到同一个位置的该元素。反之,如果一个元素在数组中出现多次,那么它的 indexOf()(第一次出现的索引)将与 lastIndexOf()(最后一次出现的索引)不同。

利用这一特性,我们可以结合 Array.prototype.filter() 方法来遍历数组,并根据每个元素 indexOf(val) === lastIndexOf(val) 的条件进行筛选。

代码实现

以下是使用 filter()、indexOf() 和 lastIndexOf() 方法实现该功能的 JavaScript 代码示例:

立即学习“Java免费学习笔记(深入)”;

const arr = [100, 123, 100, 122, 119, 203, 123, 76, 89];/** * 从数组中筛选出只出现一次的唯一元素 * @param {Array} data - 输入数组 * @returns {Array} - 包含唯一元素的数组 */const getUniqueElements = (data) => {    return data.filter((val) => data.indexOf(val) === data.lastIndexOf(val));};const result = getUniqueElements(arr);console.log(result); // 输出: [122, 119, 203, 76, 89]

逐步解析示例

为了更深入地理解上述代码的工作原理,我们以一个更简单的数组 [1, 2, 3, 1, 2] 为例,逐步分析 filter() 方法在每个元素上的判断过程。

假设我们有数组 arr = [1, 2, 3, 1, 2]。

处理第一个元素 1 (索引 0):

arr.indexOf(1) 返回 0 (从左侧找到的第一个 1 的索引)。arr.lastIndexOf(1) 返回 3 (从右侧找到的最后一个 1 的索引)。0 === 3 为 false。因此,1 被过滤掉。

处理第二个元素 2 (索引 1):

arr.indexOf(2) 返回 1 (从左侧找到的第一个 2 的索引)。arr.lastIndexOf(2) 返回 4 (从右侧找到的最后一个 2 的索引)。1 === 4 为 false。因此,2 被过滤掉。

处理第三个元素 3 (索引 2):

arr.indexOf(3) 返回 2 (从左侧找到的第一个 3 的索引)。arr.lastIndexOf(3) 返回 2 (从右侧找到的最后一个 3 的索引)。2 === 2 为 true。因此,3 被保留。

处理第四个元素 1 (索引 3):

arr.indexOf(1) 返回 0 (从左侧找到的第一个 1 的索引)。arr.lastIndexOf(1) 返回 3 (从右侧找到的最后一个 1 的索引)。0 === 3 为 false。因此,1 被过滤掉。

处理第五个元素 2 (索引 4):

arr.indexOf(2) 返回 1 (从左侧找到的第一个 2 的索引)。arr.lastIndexOf(2) 返回 4 (从右侧找到的最后一个 2 的索引)。1 === 4 为 false。因此,2 被过滤掉。

经过所有元素的迭代,最终 filter() 方法将返回一个只包含 [3] 的新数组。这完美地符合了我们的预期,即只保留那些在原数组中只出现过一次的元素。

注意事项与总结

性能考量: 尽管这种方法简洁易懂,但在处理非常大的数组时,其性能可能不是最优的。因为对于数组中的每个元素,indexOf() 和 lastIndexOf() 都可能需要遍历整个数组,导致时间复杂度接近 O(n^2)。对于百万级别以上的数据量,可以考虑使用哈希表(Map 或 Object)来统计元素出现次数,从而达到 O(n) 的时间复杂度。适用类型: 此方法适用于数组中包含基本数据类型(如数字、字符串、布尔值)的场景。对于包含对象或数组等引用类型的数组,indexOf() 和 lastIndexOf() 会进行严格相等(===)比较,这意味着它们只会查找引用地址完全相同的对象,而不会比较对象的内容。可读性: 这种解决方案的可读性非常好,通过 indexOf 和 lastIndexOf 的语义,能够直观地理解其筛选唯一元素的逻辑。

通过本文的讲解,您应该已经掌握了如何利用 JavaScript 的 indexOf() 和 lastIndexOf() 方法结合 filter() 函数,高效且准确地从数组中提取出所有只出现一次的唯一元素。在实际开发中,根据具体的数据规模和性能要求,您可以选择最适合的方案。

以上就是JavaScript 数组唯一元素提取:利用 indexOf 和 lastIndexOf 精准去重的详细内容,更多请关注创想鸟其它相关文章!

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

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
JavaScript数组:识别并提取单次出现元素的高效方法
上一篇 2025年12月20日 05:00:06
使用html2pdf生成PDF并通过Ajax发送至PHPMailer实现邮件附件功能
下一篇 2025年12月20日 05:00:12

相关推荐

  • 百度搜索app如何快速切换账号_百度搜索app多账号管理的操作方法

    百度搜索app如何快速切换账号_百度搜索app多账号管理的操作方法百度搜索app如何快速切换账号_百度搜索app多账号管理的操作方法百度搜索app如何快速切换账号_百度搜索app多账号管理的操作方法百度搜索app如何快速切换账号_百度搜索app多账号管理的操作方法

    1、可通过设置菜单退出当前账号后登录新账号实现切换;2、安卓用户可使用应用分身功能创建百度App双开实例,分别登录不同账号;3、符合条件的iOS设备可利用巨魔商店安装修改版百度App实现多开,从而同时登录多个账号。 如果您需要在百度搜索App中频繁使用不同的账号进行登录,但每次都需要退出再重新登录,…

    2026年9月28日 • 用户投稿
    1100
  • 在 Java 中对 List 的指定列进行排序和查找

    在 Java 中对 List 的指定列进行排序和查找在 Java 中对 List 的指定列进行排序和查找在 Java 中对 List 的指定列进行排序和查找在 Java 中对 List 的指定列进行排序和查找

    本文将详细介绍如何在 Java 中处理 List<List> 类型的数据,并实现以下功能:对指定列进行排序,在排序后的列表中使用二分查找(或类似方法)查找特定元素,并输出包含该元素的完整行。 问题背景 在实际开发中,我们经常会遇到需要处理二维数据的情况,例如从 CSV 文件读取的数据或者…

    2026年9月28日 • 用户投稿
    000
  • Windows记事本应用现在可以从Microsoft Store中获得

    Windows记事本应用现在可以从Microsoft Store中获得Windows记事本应用现在可以从Microsoft Store中获得Windows记事本应用现在可以从Microsoft Store中获得Windows记事本应用现在可以从Microsoft Store中获得

    早在2019年8月,微软就曾宣布计划将广受欢迎的Windows记事本应用迁移至应用商店,旨在提升其更新频率与运行效率。然而,到了同年12月底,微软突然叫停了这一计划,且未作过多解释。如今,这一目标终于得以实现——Windows记事本现已重新上线于微软应用商店,供用户下载使用。 自从Windows系统…

    2026年9月28日 • 用户投稿
    300
  • 在国内可以用的比较好的ai图片生成工具2025十大排名

    在国内可以用的比较好的ai图片生成工具2025十大排名在国内可以用的比较好的ai图片生成工具2025十大排名在国内可以用的比较好的ai图片生成工具2025十大排名在国内可以用的比较好的ai图片生成工具2025十大排名

    答案:2025年国内AI图片生成工具将更注重本地化、移动端体验、版权保护、个性化定制及行业融合,代表工具如稿定设计、盗梦师、Vega AI等,选择应基于用户需求、创作目的与预算,AI不会取代艺术家,而是辅助创作。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek…

    2026年9月28日 • 用户投稿
    1000
  • 打破次元壁!海信新风空调与王者荣耀共创电竞体验新纪元

    打破次元壁!海信新风空调与王者荣耀共创电竞体验新纪元打破次元壁!海信新风空调与王者荣耀共创电竞体验新纪元打破次元壁!海信新风空调与王者荣耀共创电竞体验新纪元打破次元壁!海信新风空调与王者荣耀共创电竞体验新纪元

    近日,awe 2024 中国家电及消费电子博览会上,海信空调以其前瞻性的战略眼光和创新精神,再次站在了家电行业的潮头。这一次,海信空调不仅带来了一系列引领行业趋势的家电新品,更宣布与国内知名电子竞技俱乐部——王者荣耀职业战队:重庆狼队王者荣耀分部正式达成深度合作,联合发布 ” 战神系列 …

    2026年9月28日 • 用户投稿
    000
  • 冻结冰雾之龙终极讨伐手册:地形卡位、火焰制裁,双流派屠龙

    冻结冰雾之龙终极讨伐手册:地形卡位、火焰制裁,双流派屠龙冻结冰雾之龙终极讨伐手册:地形卡位、火焰制裁,双流派屠龙冻结冰雾之龙终极讨伐手册:地形卡位、火焰制裁,双流派屠龙冻结冰雾之龙终极讨伐手册:地形卡位、火焰制裁,双流派屠龙

    巨人山顶的冰封湖面,盘踞着令无数褪色者闻风丧胆的寒霜君王——玻列琉斯!它的一爪一息皆可夺命,冻结大地,吞噬灵魂。然而今日,这份屠龙圣典将彻底揭晓击败它的终极之道!无论你是远程操控大师,还是近战火焰狂徒,双流派任你抉择,冰龙覆灭已成定局! 绝境制胜:枯树囚龙术 —— 地形杀局(逃课流首选) 适合人群:…

    2026年9月28日 • 用户投稿
    400
  • 抖店个体店怎么入驻?抖音小店个体户怎么入驻

    抖店个体店怎么入驻?抖音小店个体户怎么入驻抖店个体店怎么入驻?抖音小店个体户怎么入驻抖店个体店怎么入驻?抖音小店个体户怎么入驻抖店个体店怎么入驻?抖音小店个体户怎么入驻

    随着短视频平台的兴起,抖音电商成为了许多商家的新宠。其中,抖店个体店以其便捷的操作和低门槛的优势,吸引了众多创业者。如何入驻抖店个体店呢?下面,就让我为大家详细讲解一下。 一、抖店个体店入驻条件 我们来了解一下抖店个体店入驻的基本条件: 条件 说明 营业执照 需提供有效的营业执照副本 身份证 需提供…

    2026年9月28日 • 用户投稿
    000
  • 360极速浏览器怎么设置默认下载工具_关联第三方下载软件操作方法

    360极速浏览器怎么设置默认下载工具_关联第三方下载软件操作方法360极速浏览器怎么设置默认下载工具_关联第三方下载软件操作方法360极速浏览器怎么设置默认下载工具_关联第三方下载软件操作方法360极速浏览器怎么设置默认下载工具_关联第三方下载软件操作方法

    首先更改360极速浏览器默认下载工具以调用第三方下载软件。进入设置页面的下载设置选项,选择“选择默认下载工具”并从下拉列表中选取已安装的工具如迅雷或IDM;若未显示目标工具,可选“自定义”或“浏览”,手动定位其.exe主程序文件完成关联;最后通过点击网页下载链接验证是否成功调起第三方工具,确保设置生…

    2026年9月28日 • 用户投稿
    400
  • Gemini如何支持量子计算模拟 Gemini量子算法开发环境搭建

    Gemini如何支持量子计算模拟 Gemini量子算法开发环境搭建Gemini如何支持量子计算模拟 Gemini量子算法开发环境搭建Gemini如何支持量子计算模拟 Gemini量子算法开发环境搭建Gemini如何支持量子计算模拟 Gemini量子算法开发环境搭建

    本文将围绕如何利用Gemini进行量子计算模拟以及如何搭建相应的量子算法开发环境展开讨论。我们将详细介绍Gemini在量子计算模拟中的作用,并提供一套清晰、分步的指南,帮助用户完成开发环境的搭建,从而能够深入学习和实践量子算法。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 …

    2026年9月28日 • 用户投稿
    000
  • 小米路由器手机登录设置方法(简单易懂的设置教程)

    小米路由器手机登录设置方法(简单易懂的设置教程)小米路由器手机登录设置方法(简单易懂的设置教程)小米路由器手机登录设置方法(简单易懂的设置教程)小米路由器手机登录设置方法(简单易懂的设置教程)

    随着智能设备的普及,路由器已经成为了家庭中不可或缺的设备之一。而小米路由器作为一款性能强大、价格亲民的选择,备受用户们的喜爱。本文将详细介绍小米路由器的手机登录设置方法,帮助读者快速连接路由器。 Giiso写作机器人 Giiso写作机器人,让写作更简单 56 查看详情 一、路由器官方设置界面通过浏览…

    2026年9月28日 • 用户投稿
    100
  • MySQL 实现点餐系统的预定功能

    MySQL 实现点餐系统的预定功能MySQL 实现点餐系统的预定功能MySQL 实现点餐系统的预定功能MySQL 实现点餐系统的预定功能

    MySQL 实现点餐系统的预定功能,需要具体代码示例 随着科技的进步和人们生活节奏的加快,越来越多的人选择通过点餐系统进行餐厅预订,这一功能已经成为现代餐饮行业的标配。本文将介绍如何使用MySQL数据库实现一个简单的点餐系统的预定功能,并提供具体的代码示例。 在设计点餐系统的预定功能时,我们首先需要…

    2026年9月28日 • 用户投稿
    000
  • sublime如何安装主题_Sublime主题安装与切换教程

    sublime如何安装主题_Sublime主题安装与切换教程sublime如何安装主题_Sublime主题安装与切换教程sublime如何安装主题_Sublime主题安装与切换教程sublime如何安装主题_Sublime主题安装与切换教程

    首先安装Package Control,再通过命令面板搜索并安装如Material Theme等主题,最后在设置中配置theme和color_scheme选项启用,也可通过UI: Select Theme快速切换,推荐尝试One Dark、AYU等风格以提升编码体验。 Sublime Text 是一…

    2026年9月28日 • 用户投稿
    000
  • Kook电脑版官方入口 _ KOOK网页版在线登录平台

    Kook电脑版官方入口 _ KOOK网页版在线登录平台Kook电脑版官方入口 _ KOOK网页版在线登录平台Kook电脑版官方入口 _ KOOK网页版在线登录平台Kook电脑版官方入口 _ KOOK网页版在线登录平台

    KOOK电脑版官方入口是https://www.kookapp.cn/,提供稳定语音通话、文字聊天、文件传输等功能,支持跨设备同步与社区互动。 KOOK电脑版官方入口在哪里?这是许多用户都在寻找的信息,接下来由PHP小编为大家带来KOOK电脑版及网页版的在线登录平台地址,想了解这个平台特点的朋友,一…

    2026年9月28日 • 用户投稿
    100
  • 从头学起:掌握Linux命令中的通配符

    从头学起:掌握Linux命令中的通配符从头学起:掌握Linux命令中的通配符从头学起:掌握Linux命令中的通配符从头学起:掌握Linux命令中的通配符

    从头学起:掌握Linux命令中的通配符 在Linux系统中,通配符是一种用于匹配文件名的特殊字符。掌握这些通配符可以帮助我们更高效地在命令行中定位和操作文件。本文将重点介绍几种常用的Linux通配符,并附带具体的代码示例,希望可以帮助初学者更好地理解和运用这些通配符。 1. 星号(*) 星号通配符代…

    2026年9月28日 • 用户投稿
    000
  • 段永平:在黄峥进入谷歌以后才认识他,未曾建议他去谷歌

    段永平:在黄峥进入谷歌以后才认识他,未曾建议他去谷歌段永平:在黄峥进入谷歌以后才认识他,未曾建议他去谷歌段永平:在黄峥进入谷歌以后才认识他,未曾建议他去谷歌段永平:在黄峥进入谷歌以后才认识他,未曾建议他去谷歌

    9 月 26 日消息,知名投资人段永平昨晚在回应网友提问时明确表示,他是在黄峥加入谷歌之后才与其相识,因此并未参与或建议黄峥当年选择微软还是谷歌的 offer。 尽管“段永平推荐黄峥去谷歌”的说法流传甚广,但这一传闻并非无中生有。早在 2016 年,黄峥就曾在其个人公众号中亲自提及这段经历,不过文中…

    2026年9月28日 • 用户投稿
    000
  • 小红书笔记排版乱怎么办

    小红书笔记排版乱怎么办小红书笔记排版乱怎么办小红书笔记排版乱怎么办小红书笔记排版乱怎么办

    合理分段、巧用符号、统一格式可提升小红书笔记阅读体验。每表达新意换段,重点信息单独列出,用➤✨等符号引导结构,章节间以———分隔,重点词加【】或|突出;避免中英文标点混用与多余空格,数字单位间留空;封面与正文呼应,按???⚠️等模块化排版,增强节奏感与可读性。 小红书笔记排版乱,主要是因为格式不统一…

    2026年9月28日 • 用户投稿
    000
  • 在Android Studio中实现线段交点计算与碰撞检测:以Pong游戏为例

    在Android Studio中实现线段交点计算与碰撞检测:以Pong游戏为例在Android Studio中实现线段交点计算与碰撞检测:以Pong游戏为例在Android Studio中实现线段交点计算与碰撞检测:以Pong游戏为例在Android Studio中实现线段交点计算与碰撞检测:以Pong游戏为例

    本教程旨在详细讲解如何在Android Pong游戏中实现精确的线段交点计算,以处理球与球拍的碰撞。文章将从代数角度推导两条直线交点的计算公式,并进一步优化为线段交点检测,包括关键的代码实现、在游戏循环中的应用逻辑,以及针对浮点精度、球体半径等实际游戏开发中的注意事项和优化建议,帮助开发者构建更真实…

    2026年9月28日 • 用户投稿
    000
  • win7进安全模式跳到修复系统的方法?

    win7进安全模式跳到修复系统的方法?win7进安全模式跳到修复系统的方法?win7进安全模式跳到修复系统的方法?win7进安全模式跳到修复系统的方法?

    今天有朋友问我如何让win7进入安全模式跳转到维修?原来,他的电脑出了问题,win7进入安全模式跳转修复这么简单的方法就不行了,只需几步即可。在这里,小编将win7进入安全模式跳转到修复系统方法向大家介绍。 教程/方法  1,在Win7安全模式下删除顽固文件  删除时如果文件处于Windows的正常…

    2026年9月28日 • 用户投稿
    000
  • 小红书新手运营全攻略(快速起号+吸粉技巧+内容优化+稳定变现路径)

    小红书新手运营全攻略(快速起号+吸粉技巧+内容优化+稳定变现路径)小红书新手运营全攻略(快速起号+吸粉技巧+内容优化+稳定变现路径)小红书新手运营全攻略(快速起号+吸粉技巧+内容优化+稳定变现路径)小红书新手运营全攻略(快速起号+吸粉技巧+内容优化+稳定变现路径)

    答案是小红书运营需明确定位、输出优质内容、提升互动与数据分析,最终实现变现。首先确立垂直领域的人设,结合兴趣与用户需求,如“健康烘焙食谱”;内容创作注重真实、有用、有趣,标题封面吸引点击,图文排版清晰,视频节奏流畅,并合理布局关键词和标签;通过搜索、推荐、关注获取流量,积极引导互动并回复评论;利用后…

    2026年9月28日 • 用户投稿
    000
  • 如何在MySQL中创建买菜系统的支付记录表

    如何在MySQL中创建买菜系统的支付记录表如何在MySQL中创建买菜系统的支付记录表如何在MySQL中创建买菜系统的支付记录表如何在MySQL中创建买菜系统的支付记录表

    在MySQL中创建买菜系统的支付记录表是购物网站必不可少的功能。这个表主要用于存储用户在购物系统中的支付信息,包括支付金额、支付时间、订单号等。以下是如何在MySQL中创建买菜系统的支付记录表的具体代码示例: CREATE TABLE `payment_record` ( `id` int(11) …

    2026年9月28日 • 用户投稿
    100

发表回复

登录后才能评论
关注微信