js 怎样用unique对数组元素进行去重

数组去重的首选方法是使用set,因为其基于哈希表实现,查找效率为o(1),性能优于其他方法;1. 使用set去重:通过[…new set(arr)]可快速去除重复值,适用于简单数据类型且通常保持原顺序;2. 使用filter与indexof:通过arr.filter((item, index) => arr.indexof(item) === index)实现,兼容性好但性能较低;3. 使用reduce与includes:通过累加器和includes判断是否包含当前元素,逻辑清晰但效率不高;4. 处理对象数组时需自定义比较函数,如利用some方法结合id等属性判断唯一性;5. 若需排除null和undefined,可在去重前先用filter过滤;6. set还可用于集合运算,如求交集、并集、差集等,具备add、delete、has、clear和size等实用方法,功能丰富。因此,set是高效且多功能的去重选择。

js 怎样用unique对数组元素进行去重

数组去重,简单来说,就是把数组里重复的元素去掉,留下唯一的值。JavaScript 提供了多种方法来实现这个目标,但哪种方法最适合你的场景,取决于你的具体需求,比如数组的大小、数据类型、性能要求等等。

解决方案

使用 Set 数据结构

ES6 引入了 Set,它是一种集合数据结构,其特性就是不允许存储重复的值。利用这个特性,我们可以很方便地对数组进行去重。

function unique(arr) {  return [...new Set(arr)];}// 示例const numbers = [1, 2, 2, 3, 4, 4, 5];const uniqueNumbers = unique(numbers);console.log(uniqueNumbers); // 输出: [1, 2, 3, 4, 5]

这种方法简洁高效,是处理简单数据类型数组(如数字、字符串)的常用选择。

使用 Array.filter() 和 Array.indexOf()

这种方法利用

filter()

遍历数组,并使用

indexOf()

检查当前元素是否已经存在于结果数组中。如果不存在,则将其添加到结果数组。

function unique(arr) {  return arr.filter((item, index) => arr.indexOf(item) === index);}// 示例const numbers = [1, 2, 2, 3, 4, 4, 5];const uniqueNumbers = unique(numbers);console.log(uniqueNumbers); // 输出: [1, 2, 3, 4, 5]

这种方法兼容性较好,但对于大型数组,性能可能不如使用 Set。

使用 Array.reduce() 和 includes()

reduce()

方法可以将数组中的每个值(从左到右)累加,最终计算为一个值。我们可以利用它来构建一个去重后的数组。

function unique(arr) {  return arr.reduce((acc, curr) => {    if (!acc.includes(curr)) {      acc.push(curr);    }    return acc;  }, []);}// 示例const numbers = [1, 2, 2, 3, 4, 4, 5];const uniqueNumbers = unique(numbers);console.log(uniqueNumbers); // 输出: [1, 2, 3, 4, 5]

这种方法思路清晰,但

includes()

方法在大型数组中查找元素时效率较低。

处理包含对象或复杂数据类型的数组

如果数组包含对象或其他复杂数据类型,简单的

===

比较无法判断两个对象是否相等。这时,我们需要自定义比较函数。

function unique(arr, compare) {  const result = [];  arr.forEach(item => {    if (!result.some(existing => compare(item, existing))) {      result.push(item);    }  });  return result;}// 示例:比较两个对象是否具有相同的 id 属性const objects = [{ id: 1, name: 'A' }, { id: 2, name: 'B' }, { id: 1, name: 'C' }];const uniqueObjects = unique(objects, (a, b) => a.id === b.id);console.log(uniqueObjects); // 输出: [{ id: 1, name: 'A' }, { id: 2, name: 'B' }]

这里,

compare

函数用于比较两个对象是否相等。你需要根据对象的具体结构和比较逻辑来实现这个函数。

为什么 Set 通常是首选的去重方法?

Set 的底层实现通常基于哈希表,这使得它在查找元素时具有近乎常数时间的复杂度 O(1)。相比之下,

indexOf()

includes()

方法在数组中查找元素的时间复杂度为 O(n)。因此,对于大型数组,使用 Set 可以显著提高去重效率。

去重后数组的顺序会改变吗?

使用 Set 去重通常会保留原始数组的顺序。然而,不同的 JavaScript 引擎可能对此有不同的实现。如果你需要绝对保证去重后数组的顺序与原始数组一致,可以考虑使用

Array.filter()

Array.indexOf()

方法,或者在去重后对数组进行排序。

如何处理数组中的 null 和 undefined 值?

在去重时,

null

undefined

也被视为普通的值。如果需要将它们排除在去重结果之外,可以在去重前先将它们过滤掉。

function unique(arr) {  return [...new Set(arr.filter(item => item !== null && item !== undefined))];}// 示例const values = [1, 2, null, undefined, 2, 3, null];const uniqueValues = unique(values);console.log(uniqueValues); // 输出: [1, 2, 3]

除了去重,还能用 Set 做什么?

Set 不仅仅可以用于去重。它还提供了一些其他有用的方法,例如:

add(value)

: 向 Set 中添加一个值。

delete(value)

: 从 Set 中删除一个值。

has(value)

: 检查 Set 中是否包含一个值。

clear()

: 清空 Set 中的所有值。

size

: 返回 Set 中值的数量。

你可以利用这些方法来实现一些集合操作,例如求交集、并集、差集等。比如,求两个数组的交集可以这样做:

function intersection(arr1, arr2) {  const set1 = new Set(arr1);  return [...new Set(arr2)].filter(item => set1.has(item));}// 示例const arr1 = [1, 2, 3, 4, 5];const arr2 = [3, 4, 5, 6, 7];const intersectionResult = intersection(arr1, arr2);console.log(intersectionResult); // 输出: [3, 4, 5]

以上就是js 怎样用unique对数组元素进行去重的详细内容,更多请关注创想鸟其它相关文章!

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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
js 怎样绘制Canvas图形
上一篇 2025年12月20日 08:15:29
js怎么比较两个对象是否相等
下一篇 2025年12月20日 08:15:39

相关推荐

  • Java中Gatling的特点 分析DSL测试

    Java中Gatling的特点 分析DSL测试Java中Gatling的特点 分析DSL测试Java中Gatling的特点 分析DSL测试Java中Gatling的特点 分析DSL测试

    gatling通过基于akka actor模型和netty io框架实现高并发处理,每个虚拟用户由轻量级actor表示,以非阻塞方式通信,减少线程开销;其dsl使用scala编写,但在java项目中可通过maven或gradle引入依赖并编写scala脚本定义测试场景,便于版本控制;gatling生…

    2026年8月25日 用户投稿
    700
  • 抖音直播带货有哪些核心优势?选平台必看的对比亮点

    抖音直播带货凭借庞大的用户基数和成熟的内容生态,迅速成为商家与主播争相布局的核心阵地。相较于传统电商模式,抖音通过算法驱动推荐机制与社交裂变能力,大幅增强直播间曝光机会与成交转化效率。在实际运营过程中,品牌不仅能高效触达广泛潜在人群,还能借助高频互动提升用户粘性与忠诚度。接下来将深入剖析抖音在直播电…

    2026年8月25日
    000
  • VSCode怎么切换解释器_VSCode更换Python/Node等运行环境教程

    答案:在VSCode中切换解释器需通过命令面板或状态栏选择Python解释器,使用nvm或配置settings.json切换Node版本,遇报错可重启、检查扩展与路径,避免自动回切需手动指定并禁提示。 在VSCode中切换解释器,其实就是告诉VSCode用哪个Python环境,或者哪个Node版本来…

    2026年8月25日
    000
  • Java中Spring Test的作用 解析上下文

    Java中Spring Test的作用 解析上下文Java中Spring Test的作用 解析上下文Java中Spring Test的作用 解析上下文Java中Spring Test的作用 解析上下文

    spring test的主要作用是提供隔离环境以测试spring组件并解析上下文,其核心价值在于简化测试配置。1. 使用@contextconfiguration注解加载测试上下文,可通过xml配置文件或java配置类定义测试专用bean;2. 通过@runwith(springrunner.cla…

    2026年8月25日 用户投稿
    000
  • 抖音上架小程序有哪些条件

    要在抖音成功上线小程序,需满足一系列关键要求,主要包括:开发者具备合法资质、功能完整稳定、内容符合法规规范,以及提供优质的用户体验。以下将详细解析每一项具体条件。 拥有合规的开发者身份 想要在抖音发布小程序,首先必须完成开发者身份认证: 企业主体资格:公司需注册为抖音开放平台开发者,并提交营业执照等…

    2026年8月25日
    000
  • 王者荣耀英雄熟练度排名查询_轻松查看英雄排名技巧

    要查看《王者荣耀》中英雄的熟练度排名,需通过游戏内的“荣耀战力”来判断,熟练度等级仅反映使用时长,而排名则由荣耀战力决定;进入个人主页点击“英雄”选项,选择具体英雄后查看其详情页的荣耀战力及“查看排名”即可了解在区、市、省的排名情况,或通过“排行榜”中的“荣耀战力榜”切换区域查看;熟练度高但战力排名…

    2026年8月25日
    200
  • SEO测试太麻烦?juampi92/test-seo助你轻松搞定!

    在网站开发中,保证良好的SEO至关重要,但手动测试每一个页面上的SEO标签,简直让人头大。之前,我一直苦恼于如何高效地验证SEO的正确性。直到我发现了juampi92/test-seo这个Composer包,它简直是SEO测试的救星!Composer在线学习地址:学习地址 juampi92/test…

    用户投稿 2026年8月25日
    400
  • 一把吉他卖出 10 亿后,LiberLive 选择自我革命

    一把吉他卖出 10 亿后,LiberLive 选择自我革命一把吉他卖出 10 亿后,LiberLive 选择自我革命一把吉他卖出 10 亿后,LiberLive 选择自我革命一把吉他卖出 10 亿后,LiberLive 选择自我革命

    如果你是一个社交媒体的高频用户,你很可能已经刷到过不少抱着一把智能吉他弹唱的主播了。 不需要高门槛的学习,无弦吉他给那些不会乐器的人提供了一个机会——用游戏般简单的体验,就能实现抱着吉他弹唱的梦想。自 2023 年 LiberLive 首发初代产品之后,无弦吉他俨然已成为一个新的消费电子赛道。 开创…

    2026年8月25日 用户投稿
    100
  • URL加密太长怎么办?StephenHill/Base58帮你缩短URL

    在Web应用开发中,URL的长度一直是一个需要关注的问题。过长的URL不仅难以记忆和分享,还可能在某些系统中受到限制。传统的Base64编码虽然能够将二进制数据转换为文本格式,但其编码后的字符串长度往往较长。这时,Base58编码就派上了用场。Composer在线学习地址:学习地址StephenHi…

    用户投稿 2026年8月25日
    100
  • Laravel中的通知(Notifications)系统如何使用?

    在laravel中使用通知系统可以通过以下步骤实现:创建通知类:使用命令php artisan make:notification userregistered生成通知文件,并在其中定义通知逻辑和发送通道。触发通知:在用户模型中添加方法如sendregistrationnotification,并在…

    2026年8月25日
    000
  • 解决Spryker项目中Symfony依赖管理混乱问题,使用spryker/symfony模块实现高效解耦

    可以通过一下地址学习composer:学习地址 当Spryker遇上Symfony:依赖管理的痛点 想象一下,你正在维护一个庞大的Spryker电商平台。随着业务的扩张,项目中的模块(如购物车、订单、用户管理等)如雨后春笋般涌现。这些模块为了实现各自的功能,不可避免地会依赖各种Symfony组件——…

    用户投稿 2026年8月25日
    000
  • 数据库查询优化与索引设计

    我们需要关注数据库查询优化与索引设计,因为它们直接影响应用性能和用户体验。1) 通过优化查询和设计合适的索引,可以显著减少查询时间,提高系统响应速度。2) 索引帮助数据库快速定位数据,但过多索引会增加数据操作开销。3) 使用explain命令分析查询计划,添加适当索引如create index id…

    2026年8月25日
    100
  • Laravel与CDN集成的最佳实践

    为什么要将laravel与cdn集成?将laravel与cdn集成可以显著提升网站的加载速度和用户体验。具体做法包括:1. 在.env文件中配置cdn_url。2. 在blade模板中使用环境变量引用静态资源。3. 只将对页面加载速度影响大的资源推送到cdn。4. 使用版本控制或哈希文件名管理cdn…

    2026年8月25日
    100
  • 随便记录下系列 – node->express

    系列记录 – node.js到express的一站式指南 一、在Windows上安装Node.js环境:从官方网站下载Node.js,需替换下载链接 https://nodejs.org/dist/v6.2.0/node-v6.2.0-x64.msi 中的版本号6.2.0为所需版本即可。…

    2026年8月25日
    400
  • Java中如何实现链路追踪 掌握Sleuth

    Java中如何实现链路追踪 掌握SleuthJava中如何实现链路追踪 掌握SleuthJava中如何实现链路追踪 掌握SleuthJava中如何实现链路追踪 掌握Sleuth

    如何在spring boot项目中集成sleuth?首先,在pom.xml中添加sleuth依赖:spring-cloud-starter-sleuth;其次,如需对接zipkin,添加spring-cloud-sleuth-zipkin依赖;然后,在配置文件中设置zipkin服务器地址和应用名称。…

    2026年8月25日 用户投稿
    000
  • Java中IoC是什么概念 图解控制反转和依赖注入的实现原理

    Java中IoC是什么概念 图解控制反转和依赖注入的实现原理Java中IoC是什么概念 图解控制反转和依赖注入的实现原理Java中IoC是什么概念 图解控制反转和依赖注入的实现原理Java中IoC是什么概念 图解控制反转和依赖注入的实现原理

    ioc反转的是对象的控制权。传统开发中对象自己管理依赖,而ioc将对象创建和依赖管理交给外部容器,从而实现控制权的反转。ioc是一种设计原则,di是其具体实现方式,通过构造器、setter或接口注入依赖。java中依赖注入主要有三种方式:1.构造器注入,通过构造函数传递依赖,优点是依赖明确且不可变;…

    2026年8月25日 用户投稿
    000
  • java中的field有什么用 字段field的3个访问控制技巧

    java中的field有什么用 字段field的3个访问控制技巧java中的field有什么用 字段field的3个访问控制技巧java中的field有什么用 字段field的3个访问控制技巧java中的field有什么用 字段field的3个访问控制技巧

    java中的field主要用于反射,允许运行时检查和修改类的字段,包括私有字段。具体步骤如下:1. 获取class对象后,使用getfield()或getdeclaredfield()获取field对象,前者用于获取public字段(包括继承的),后者用于获取本类声明的所有字段;2. 使用setac…

    2026年8月25日 用户投稿
    000
  • Java中锁的分类有哪些 详解Java中的各种锁机制

    Java中锁的分类有哪些 详解Java中的各种锁机制Java中锁的分类有哪些 详解Java中的各种锁机制Java中锁的分类有哪些 详解Java中的各种锁机制Java中锁的分类有哪些 详解Java中的各种锁机制

    java中的锁主要分为悲观锁与乐观锁、公平锁与非公平锁、可重入锁与不可重入锁、独占锁与共享锁等类型。1.悲观锁如synchronized和reentrantlock适用于写多场景,每次操作都加锁保证数据一致性;2.乐观锁通过版本号或cas实现,适用于读多写少的场景,提高吞吐量;3.公平锁按申请顺序获…

    2026年8月25日 用户投稿
    100
  • 电脑提示DirectX错误导致玩不了游戏怎么办 4种实用方法

    电脑提示DirectX错误导致玩不了游戏怎么办 4种实用方法电脑提示DirectX错误导致玩不了游戏怎么办 4种实用方法电脑提示DirectX错误导致玩不了游戏怎么办 4种实用方法电脑提示DirectX错误导致玩不了游戏怎么办 4种实用方法

    directx是windows平台上运行游戏和图形应用的关键技术组件。当启动游戏时出现“directx错误”“缺少dx11/12”等提示,可能导致程序闪退、画面异常或无法正常运行。以下是几种有效的解决方式。 方法1:更新或修复DirectX组件 DirectX 12等新版组件通常随系统更新一并发布。…

    2026年8月25日 用户投稿
    000
  • 抖音小程序是用什么语音做的

    抖音小程序由字节跳动自主研发,基于其自有的“字节跳动小程序”技术框架构建。该框架在设计上借鉴了微信小程序的开发模式,同时融合了平台自身的特点与需求。开发者可通过 JavaScript、HTML 和 CSS 完成前端界面与逻辑开发,后端则可灵活选用多种服务端语言和技术进行对接。 抖音小程序的技术架构解…

    2026年8月25日
    000

发表回复

登录后才能评论
关注微信