当前位置 : 祺云SEO > 程序开发>

js数组去重有哪些方法?js数组去重方法有哪些

时间:2026-06-14 来源:祺云SEO
【前端面试题-JS】JS数组去重
小鹿线-AI产品经理
206224-原视频地址 方案名称 核心实现逻辑 时间复杂度 空间复杂度 兼容性 适用场景 双重循环 嵌套遍历,逐个比对 $O(n^2)$ $O(1)$ 所有浏览器 数据量极小(<100项) 排序后去重 先排序,再相邻比较 $O(nlogn)$ $O(n)$ 所有浏览器 需保持有序且数据量大 indexOf/includes 利用数组API查找 $O(n^2)$ $O(n)$ IE9+ 代码简洁性优先,数据量中等 Set对象 利用ES6Set结构

$O(n)$$O(n)$IE不支持现代Web开发首选

Map对象利用键值对唯一性$O(n)$$O(n)$IE不支持需保留原始索引或复杂对象filter+indexOf函数式编程风格$O(n^2)$$O(n)$IE9+追求函数式代码风格

深度测评与性能解析

基础方案:双重循环与indexOf

双重循环是最直观的实现方式,通过两个for循环逐一比对元素,虽然逻辑简单,但其时间复杂度高达$O(n^2)$,当数组元素超过1000个时,性能会出现断崖式下跌,导致主线程阻塞,引发页面卡顿。

indexOf方案虽然代码更简洁,但其本质仍是线性查找,时间复杂度同样为$O(n^2)$,尽管在现代浏览器中经过优化,但在处理大规模数据时,依然不如哈希结构高效。

进阶方案:Set对象去重

ES6引入的Set数据结构,其成员值都是唯一的,利用newSet()可以快速过滤重复项,再通过扩展运算符或Array.from()转换回数组。

constarr=[1,2,2,3,4,4,5];constuniqueArr=[...newSet(arr)];

专业评估:

  • 性能优势:Set内部的实现通常基于哈希表,查找和插入的平均时间复杂度接近$O(1)$,整体去重时间复杂度为$O(n)$,在百万级数据测试中,其执行速度比双重循环快数十倍。
  • 局限性:仅支持基本数据类型(Number,String,Boolean等)和引用类型的完全去重(即两个不同的对象即使内容相同,也会被保留),对于包含复杂对象的数组,需要配合自定义逻辑。

高阶方案:Map对象去重

当需要处理复杂对象或需要保留元素首次出现的索引时,Map是更优选择,Map的键名具有唯一性,利用这一特性可以实现高效去重。

functionuniqueWithMap(arr){constmap=newMap();constresult=[];for(letitemofarr){if(!map.has(item)){map.set(item,true);result.push(item);}}returnresult;}

专业评估:
此方案同样具备$O(n)$的时间复杂度,且灵活性极高,通过自定义Map的Key生成逻辑(如JSON序列化或特定属性提取),可以实现针对复杂对象数组的精准去重。

特殊场景:排序去重

对于纯数字或纯字符串数组,先排序再去重是一种空间换时间的策略。

constarr=[3,1,2,1,3,4];arr.sort((a,b)=>a-b);constuniqueArr=arr.filter((item,index,arr)=>{return!indexitem!==arr[index-1];});

专业评估:
虽然排序操作引入了$O(nlogn)$的开销,但由于避免了嵌套循环,在某些特定数据分布下表现稳定,排序会改变原数组的顺序,且对非原始类型支持较差,需谨慎使用。

复杂对象数组去重实战

在实际业务中,我们常遇到包含对象的数组去重需求,由于对象是引用类型,Set无法直接区分内容相同但引用不同的对象,建议采用JSON序列化唯一标识符策略。

推荐方案:基于唯一ID去重

constusers=[{id:1,name:'Alice'},{id:2,name:'Bob'},{id:1,name:'Alice'}//重复];constuniqueUsers=Object.values(users.reduce((acc,curr)=>{acc[curr.id]=curr;returnacc;},{}));

此方法利用对象键的唯一性,时间复杂度为$O(n)$,且能完美保留对象引用,是处理复杂数据结构的最佳实践。

2026年服务器资源优化与活动优惠说明

在2026年的Web开发环境中,前端性能优化已不再仅仅是代码层面的技巧,更与服务器资源配置紧密相关,随着AI辅助编程和自动化构建工具的普及,代码体积的压缩与TreeShaking已成为标配。高频的数组操作若未优化,仍会导致客户端CPU占用过高,进而影响服务器对静态资源的分发效率。

为了帮助开发者提升应用性能,我们特别推出2026年度前端性能优化专项支持计划

活动详情

  • 活动时间:2026年1月1日–2026年12月31日
  • 参与对象:所有使用我们云服务器部署前端应用的开发者与企业用户
  • 核心权益
    1. 免费性能诊断报告:每月提供一次针对前端JS执行效率的深度分析报告,包含数组操作瓶颈检测。
    2. CDN加速升级:活动期间,新用户可享CDN流量包5折优惠,确保去重后的高效代码快速触达用户。
    3. 技术支持绿色通道:资深前端架构师一对一咨询,解决复杂数据渲染难题。

如何参与

登录控制台,进入“活动专区”,领取2026性能优化助力券,无需复杂申请,即时生效。

总结与建议

在选择JS数组去重方案时,应遵循以下原则:

  1. 数据量小且兼容要求高:使用indexOf或双重循环,代码简洁,维护成本低。
  2. 现代浏览器环境,追求极致性能首选Set对象,代码优雅且性能优异。
  3. 复杂对象数组:使用Mapreduce结合唯一标识符,确保逻辑正确性与性能平衡。
  4. 需保持有序:考虑先排序再过滤,但需注意性能开销。

性能优化是一场持久战,通过合理选择数据结构与算法,结合2026年最新的服务器资源优化策略,我们可以构建出更加快速、稳定且用户友好的Web应用。