js如何合并两个数组去重

在javascript中合并两个数组并去除重复项,最简洁高效的方法是使用set结合展开运算符。1. 对于原始类型值,直接使用[…new set([…arr1, …arr2])]即可完成合并与去重,set会自动处理唯一性,包括将nan视为单一值;2. 对于对象数组,因set基于引用判断相等,需采用基于唯一id的map去重法:遍历合并后的数组,以对象id为键存入map,后出现的同id对象会覆盖前者,最后转回数组;3. 也可尝试json.stringify序列化对象后用set去重,但该方法受限于属性顺序、不可序列化值(如函数、undefined)及循环引用问题,适用场景有限;4. 性能上,set和map方案平均时间复杂度为o(n),远优于循环嵌套indexof的o(n²),优化关键在于选择合适算法:原始类型用set,对象类型优先基于唯一id使用map,并避免对无重复数据做冗余去重操作。该策略兼顾效率、可读性与实用性,是处理数组合并去重的推荐方案。

js如何合并两个数组去重

在JavaScript中合并两个数组并去除重复项,通常最简洁且高效的方法是利用

Set

数据结构的特性,结合展开运算符(

...

)来完成。这不仅能快速合并,还能自动处理原始类型值的去重。

js如何合并两个数组去重

合并和去重数组,我通常会倾向于使用

Set

。它提供了一种非常直观且性能不错的方案。

function mergeAndDeduplicateArrays(arr1, arr2) {  // 使用展开运算符合并数组,然后通过Set自动去重  const combinedSet = new Set([...arr1, ...arr2]);  // 将Set转换回数组  return Array.from(combinedSet);  // 或者更简洁地:return [...new Set([...arr1, ...arr2])];}// 示例const arrayA = [1, 2, 3, 4, 'a', 'b', null, undefined];const arrayB = [3, 4, 5, 6, 'b', 'c', null, undefined, NaN]; // NaN会被视为一个,但两个NaN是不同的const result = mergeAndDeduplicateArrays(arrayA, arrayB);console.log(result); // [1, 2, 3, 4, 'a', 'b', null, undefined, 5, 6, 'c', NaN]

这个方法对于数字、字符串、布尔值、

null

undefined

等原始类型表现完美。

Set

内部会确保每个值都是唯一的,

NaN

虽然不等于自身,但在

Set

中会被视为唯一的一个值。

js如何合并两个数组去重

为什么Set是处理数组去重合并的优选方案?

在我看来,

Set

之所以成为JavaScript中处理数组去重合并的首选,主要在于其设计哲学与实际效率。它就是为了存储不重复的值而生的,这与我们的需求完美契合。

首先,

Set

内置去重能力是其最大的优势。当你向一个

Set

添加元素时,它会自动检查该元素是否已经存在。如果存在,就不会重复添加;如果不存在,则会加入。这种机制省去了我们手动编写复杂的循环和条件判断来检查重复项的麻烦,代码自然就更简洁、更易读。

js如何合并两个数组去重

其次,从性能角度看,

Set

的查找和插入操作通常具有接近O(1)的平均时间复杂度(虽然在最坏情况下可能退化,但对于大多数实际场景,其性能表现都非常出色)。这意味着无论数组有多大,处理原始类型时,

Set

都能提供相当快的去重速度。相比之下,如果采用传统的手动遍历加

indexOf

includes

去重,时间复杂度可能达到O(n^2),在大数据量面前会显得非常慢。

再者,

Set

在处理

NaN

undefined

等特殊值时,行为也符合直觉。

NaN

在JavaScript中是一个很特别的值,它不等于自身。但

Set

在处理

NaN

时,会将其视为一个唯一的元素。比如,你往

Set

里加两个

NaN

,最终

Set

里只会有一个

NaN

。这避免了一些潜在的陷阱。

总的来说,

Set

提供了一种声明式、高效且语义清晰的方式来解决数组合并去重的问题,让开发者可以把精力放在更核心的业务逻辑上,而不是纠结于去重的实现细节。

合并去重时,如何处理数组中包含对象的情况?

这是一个常见的“坑”,也是

Set

直接去重方案的局限性所在。当数组中包含对象时,

Set

的默认去重机制可能不会按照你预期的那样工作。因为

Set

使用严格相等(

===

来判断值的唯一性。对于对象来说,即使两个对象拥有完全相同的属性和值,只要它们在内存中是不同的引用,

Set

就会认为它们是两个不同的对象。

比如:

[{id: 1, name: 'A'}]

[{id: 1, name: 'A'}]

,这两个对象在

Set

看来是不同的。

要解决这个问题,我们需要引入一些自定义的逻辑,核心思路是:定义“重复”的标准。通常,我们会基于对象的一个或多个唯一属性(比如

id

uuid

key

等)来判断对象是否重复。

以下是几种处理策略:

基于唯一ID属性去重(推荐且常用)这是最常见也最实用的方法。如果你的对象都有一个唯一的标识符(如

id

),你可以利用这个

id

来判断对象是否重复。

function mergeAndDeduplicateObjectsById(arr1, arr2) {  const combined = [...arr1, ...arr2];  const uniqueMap = new Map(); // 使用Map来存储唯一的对象,key为id  for (const item of combined) {    if (item && item.id !== undefined) { // 确保对象存在且有id属性      // 如果Map中没有这个id,或者新对象的版本更“新”(根据业务逻辑决定)      // 这里我们简单地以id为key存储,后来的同id对象会覆盖前面的      uniqueMap.set(item.id, item);    }  }  return Array.from(uniqueMap.values());}const arrObj1 = [{id: 1, name: 'Alice'}, {id: 2, name: 'Bob'}];const arrObj2 = [{id: 2, name: 'Robert'}, {id: 3, name: 'Charlie'}];const resultObj = mergeAndDeduplicateObjectsById(arrObj1, arrObj2);// 结果可能取决于你希望保留哪个同ID对象,这里是后者覆盖前者console.log(resultObj);// 预期输出:[{id: 1, name: 'Alice'}, {id: 2, name: 'Robert'}, {id: 3, name: 'Charlie'}]

这种方法高效,因为

Map

Set

get

操作也是接近O(1)的平均时间复杂度。

降重鸟 降重鸟

要想效果好,就用降重鸟。AI改写智能降低AIGC率和重复率。

降重鸟 113 查看详情 降重鸟

将对象转换为字符串去重(适用于简单、可序列化对象)如果你确定对象的所有属性都是可JSON序列化的,并且属性顺序不影响唯一性判断,可以考虑将对象

JSON.stringify

成字符串,然后用

Set

去重字符串。

function mergeAndDeduplicateObjectsByStringify(arr1, arr2) {  const combined = [...arr1, ...arr2];  const uniqueStrings = new Set();  const uniqueObjects = [];  for (const item of combined) {    try {      const itemString = JSON.stringify(item);      if (!uniqueStrings.has(itemString)) {        uniqueStrings.add(itemString);        uniqueObjects.push(item);      }    } catch (e) {      console.warn("无法序列化对象,跳过:", item, e);      // 处理不可序列化的对象,比如包含循环引用    }  }  return uniqueObjects;}const arrObj3 = [{a:1, b:2}, {b:2, a:1}, {c:3}]; // 注意:JSON.stringify对属性顺序敏感const arrObj4 = [{a:1, b:2}, {d:4}];// 如果属性顺序不同,即使内容一样,也会被认为是不同的// [{a:1, b:2}] 和 [{b:2, a:1}] 可能会被认为是两个不同的字符串const resultStr = mergeAndDeduplicateObjectsByStringify(arrObj3, arrObj4);console.log(resultStr);

局限性:

JSON.stringify

对属性的顺序是敏感的,

{a:1, b:2}

{b:2, a:1}

会被序列化成不同的字符串。此外,它不能处理循环引用、函数、

undefined

等非JSON值。因此,这种方法只适用于结构非常简单且可控的对象。

选择哪种方法,取决于你的具体业务场景和对象结构。通常,基于唯一ID属性的去重是最健壮和推荐的方案。

合并去重操作对性能有什么影响?我们应该如何优化?

合并和去重操作的性能影响,很大程度上取决于你选择的算法、数组的大小以及数组中元素的类型。理解这些影响,能帮助我们做出更明智的优化决策。

性能影响分析:

时间复杂度:

Set

方法(针对原始类型): 通常是O(N),其中N是合并后数组的总元素数。这是因为

Set

的插入和查找操作平均是常数时间。这是最理想的情况。基于

Map

的ID去重(针对对象): 同样接近O(N)。通过对象的唯一ID作为

Map

的键,查找和插入效率很高。循环

+
indexOf

/

includes

这是效率最低的常见方法,时间复杂度为O(N^2)。每添加一个元素,都需要遍历已处理的部分来检查是否重复。当N很大时,性能会急剧下降。

JSON.stringify

Set

去重: 涉及到字符串化(O(K) K为对象属性数)和字符串的哈希计算(可能与字符串长度有关),整体性能介于O(N)和O(N^2)之间,取决于对象的复杂度和数量。

内存占用

Set

Map

都需要额外的内存来存储其内部数据结构。对于非常大的数组,这可能会是一个考虑因素,但通常在现代浏览器环境中不是瓶颈。

JSON.stringify

会创建新的字符串副本,也增加了临时内存消耗。

优化策略:

选择正确的算法:

优先使用

Set

和展开运算符来处理包含原始类型(数字、字符串、布尔值等)的数组去重。这是最直接、最高效的方案。对于包含对象的数组,务必使用基于唯一标识符(如

id

)的

Map

或自定义遍历逻辑去重。 避免直接将对象放入

Set

,因为它只会比较引用。

避免不必要的去重:

如果数据来源本身就保证了唯一性,或者你只关心合并而不关心去重,那就不要进行去重操作。在某些场景下,如果数据量非常大且频繁进行合并去重,可以考虑增量更新。只对新增或变化的部分进行去重,而不是每次都处理整个数据集。

考虑数据结构的设计:

在后端或数据源层面就保证数据的唯一性,减少前端去重的负担。例如,数据库查询结果就避免重复。如果对象去重是常见需求,确保你的对象有一个明确且易于访问的唯一ID。

性能瓶颈分析:

对于性能敏感的应用,如果发现合并去重是瓶颈,可以使用浏览器开发者工具(如Chrome DevTools的Performance面板)进行剖析,找出具体是哪一步耗时最多。有时候,瓶颈可能不在去重本身,而在前置的数据处理或后置的DOM操作。

总的来说,对于JS数组的合并去重,我的经验是:对于原始类型,

Set

就是王者,直接用就好;对于对象,关键在于你如何定义“重复”,然后用

Map

或自定义遍历来高效实现这个定义。过早的微优化往往是浪费时间,但选择正确的、高效率的算法是基础。

以上就是js如何合并两个数组去重的详细内容,更多请关注创想鸟其它相关文章!

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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月3日 22:28:16
下一篇 2025年11月3日 22:29:09

相关推荐

  • soul怎么发长视频瞬间_Soul长视频瞬间发布方法

    可通过分段发布、格式转换或剪辑压缩三种方法在Soul上传长视频。一、将长视频用相册编辑功能拆分为多个30秒内片段,依次发布并标注“Part 1”“Part 2”保持连贯;二、使用“格式工厂”等工具将视频转为MP4(H.264)、分辨率≤1080p、帧率≤30fps、大小≤50MB,适配平台要求;三、…

    2025年12月6日 软件教程
    000
  • AO3镜像站备用镜像网址_AO3镜像站快速访问官网

    AO3镜像站备用网址包括ao3mirror.com和xiaozhan.icu,当主站archiveofourown.org无法访问时可切换使用,二者均同步更新内容并支持多语言检索与离线下载功能。 AO3镜像站备用镜像网址在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来AO3镜像站快速访问官…

    2025年12月6日 软件教程
    000
  • 天猫app淘金币抵扣怎么使用

    在天猫app购物时,淘金币是一项能够帮助你节省开支的实用功能。掌握淘金币的抵扣使用方法,能让你以更实惠的价格买到心仪商品。 当你选好商品并准备下单时,记得查看商品页面是否支持淘金币抵扣。如果该商品支持此项功能,在提交订单的页面会明确显示相关提示。你会看到淘金币的具体抵扣比例——通常情况下,淘金币可按…

    2025年12月6日 软件教程
    000
  • Pboot插件缓存机制的详细解析_Pboot插件缓存清理的命令操作

    插件功能异常或页面显示陈旧内容可能是缓存未更新所致。PbootCMS通过/runtime/cache/与/runtime/temp/目录缓存插件配置、模板解析结果和数据库查询数据,提升性能但影响调试。解决方法包括:1. 手动删除上述目录下所有文件;2. 后台进入“系统工具”-“缓存管理”,勾选插件、…

    2025年12月6日 软件教程
    000
  • Word2013如何插入SmartArt图形_Word2013SmartArt插入的视觉表达

    答案:可通过四种方法在Word 2013中插入SmartArt图形。一、使用“插入”选项卡中的“SmartArt”按钮,选择所需类型并插入;二、从快速样式库中选择常用模板如组织结构图直接应用;三、复制已有SmartArt图形到目标文档后调整内容与格式;四、将带项目符号的文本选中后右键转换为Smart…

    2025年12月6日 软件教程
    000
  • 《kk键盘》一键发图开启方法

    如何在kk键盘中开启一键发图功能? 1、打开手机键盘,找到并点击“kk”图标。 2、进入工具菜单后,选择“一键发图”功能入口。 3、点击“去开启”按钮,跳转至无障碍服务设置页面。 4、在系统通用设置中,进入“已下载的应用”列表。 j2me3D游戏开发简单教程 中文WORD版 本文档主要讲述的是j2m…

    2025年12月6日 软件教程
    000
  • 怎样用免费工具美化PPT_免费美化PPT的实用方法分享

    利用KIMI智能助手可免费将PPT美化为科技感风格,但需核对文字准确性;2. 天工AI擅长优化内容结构,提升逻辑性,适合高质量内容需求;3. SlidesAI支持语音输入与自动排版,操作便捷,利于紧急场景;4. Prezo提供多种模板,自动生成图文并茂幻灯片,适合学生与初创团队。 如果您有一份内容完…

    2025年12月6日 软件教程
    000
  • jm漫画官方正版入口 jm漫画官方网站登录链接

    JM漫画作为一个致力于为广大漫画爱好者服务的全方位的数字漫画阅读平台,凭借其海量的资源储备、卓越的阅读体验和人性化的功能设计,在众多同类平台中脱颖而出。它不仅收录了来自世界各地的热门连载与经典完结作品,更通过智能推荐算法,精准地将符合用户口味的精彩内容呈现眼前,让每一位用户都能在这里找到属于自己的精…

    2025年12月6日 软件教程
    000
  • 怎么下载安装快手极速版_快手极速版下载安装详细教程

    1、优先通过华为应用市场搜索“快手极速版”,确认开发者为北京快手科技有限公司后安装;2、若应用商店无结果,可访问快手极速版官网下载APK文件,需手动开启浏览器的未知来源安装权限;3、也可选择豌豆荚、应用宝等可信第三方平台下载官方版本,核对安全标识后完成安装。 如果您尝试在手机上安装快手极速版,但无法…

    2025年12月6日 软件教程
    000
  • 哔哩哔哩的视频卡在加载中怎么办_哔哩哔哩视频加载卡顿解决方法

    视频加载停滞可先切换网络或重启路由器,再清除B站缓存并重装应用,接着调低播放清晰度并关闭自动选分辨率,随后更改播放策略为AVC编码,最后关闭硬件加速功能以恢复播放。 如果您尝试播放哔哩哔哩的视频,但进度条停滞在加载状态,无法继续播放,这通常是由于网络、应用缓存或播放设置等因素导致。以下是解决此问题的…

    2025年12月6日 软件教程
    000
  • 买家网购苹果手机仅退款不退货遭商家维权,法官调解后支付货款

    10 月 24 日消息,据央视网报道,近年来,“仅退款”服务逐渐成为众多网购平台的常规配置,但部分消费者却将其当作“免费试用”的手段,滥用规则谋取私利。 江苏扬州市民李某在某电商平台购买了一部苹果手机,第二天便以“不想要”为由在线申请“仅退款”,当时手机尚在物流运输途中。第三天货物送达后,李某签收了…

    2025年12月6日 行业动态
    000
  • Linux中如何安装Nginx服务_Linux安装Nginx服务的完整指南

    首先更新系统软件包,然后通过对应包管理器安装Nginx,启动并启用服务,开放防火墙端口,最后验证欢迎页显示以确认安装成功。 在Linux系统中安装Nginx服务是搭建Web服务器的第一步。Nginx以高性能、低资源消耗和良好的并发处理能力著称,广泛用于静态内容服务、反向代理和负载均衡。以下是在主流L…

    2025年12月6日 运维
    000
  • 当贝X5S怎样看3D

    当贝X5S观看3D影片无立体效果时,需开启3D模式并匹配格式:1. 播放3D影片时按遥控器侧边键,进入快捷设置选择3D模式;2. 根据片源类型选左右或上下3D格式;3. 可通过首页下拉进入电影专区选择3D内容播放;4. 确认片源为Side by Side或Top and Bottom格式,并使用兼容…

    2025年12月6日 软件教程
    000
  • Linux journalctl与systemctl status结合分析

    先看 systemctl status 确认服务状态,再用 journalctl 查看详细日志。例如 nginx 启动失败时,systemctl status 显示 Active: failed,journalctl -u nginx 发现端口 80 被占用,结合两者可快速定位问题根源。 在 Lin…

    2025年12月6日 运维
    000
  • TikTok视频无法下载怎么办 TikTok视频下载异常修复方法

    先检查链接格式、网络设置及工具版本。复制以https://www.tiktok.com/@或vm.tiktok.com开头的链接,删除?后参数,尝试短链接;确保网络畅通,可切换地区节点或关闭防火墙;更新工具至最新版,优先选用yt-dlp等持续维护的工具。 遇到TikTok视频下载不了的情况,别急着换…

    2025年12月6日 软件教程
    000
  • Linux如何防止缓冲区溢出_Linux防止缓冲区溢出的安全措施

    缓冲区溢出可通过栈保护、ASLR、NX bit、安全编译选项和良好编码实践来防范。1. 使用-fstack-protector-strong插入canary检测栈破坏;2. 启用ASLR(kernel.randomize_va_space=2)随机化内存布局;3. 利用NX bit标记不可执行内存页…

    2025年12月6日 运维
    000
  • 2025年双十一买手机选直板机还是选折叠屏?建议看完这篇再做决定

    随着2025年双十一购物节的临近,许多消费者在选购智能手机时都会面临一个共同的问题:是选择传统的直板手机,还是尝试更具科技感的折叠屏设备?其实,这个问题的答案早已在智能手机行业的演进中悄然浮现——如今的手机市场已不再局限于“拼参数、堆配置”的初级竞争,而是迈入了以形态革新驱动用户体验升级的新时代。而…

    2025年12月6日 行业动态
    000
  • Pboot插件数据库连接的配置教程_Pboot插件数据库备份的自动化脚本

    首先配置PbootCMS数据库连接参数,确保插件正常访问;接着创建auto_backup.php脚本实现备份功能;然后通过Windows任务计划程序或Linux Cron定时执行该脚本,完成自动化备份流程。 如果您正在开发或维护一个基于PbootCMS的网站,并希望实现插件对数据库的连接配置以及自动…

    2025年12月6日 软件教程
    000
  • jm漫画网页网址 jm漫画网页版进入 jm漫画网站网页版

    在广阔的数字漫画世界中,无数爱好者渴望寻得一个能够汇集海量作品、提供流畅阅读体验的综合性平台。这样的平台不仅是追更新、补旧番的乐园,更是连接创作者与读者的桥梁,让每一个精彩的故事都能被发现和分享。它以其丰富的资源和人性化的设计,成为了漫画迷们探索奇妙二次元世界的理想起点,满足了从热门大作到小众佳作的…

    2025年12月6日 软件教程
    000
  • 今日头条官方主页入口 今日头条平台直达网址官方链接

    今日头条官方主页入口是www.toutiao.com,该平台通过个性化信息流推送图文、短视频等内容,具备分类导航、便捷搜索及跨设备同步功能。 今日头条官方主页入口在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来今日头条平台直达网址官方链接,感兴趣的网友一起随小编来瞧瞧吧! www.tout…

    2025年12月6日 软件教程
    000

发表回复

登录后才能评论
关注微信