当前位置: 首页 > news >正文

在JavaScript中,如何给字符串数组中的元素去重

在 JavaScript 中,给字符串数组(或其他类型数组)去重有多种方法,下面列举几种常用的方式,并说明各自的特点。


1. 利用Set(最简洁、推荐)

Set是 ES6 新增的数据结构,它类似于数组,但成员的值都是唯一的。将数组传入Set构造函数,再通过扩展运算符或Array.from()转回数组即可。

constarr=['apple','banana','apple','orange','banana'];constunique=[...newSet(arr)];console.log(unique);// ['apple', 'banana', 'orange']

优点:代码简洁,效率高(时间复杂度 O(n))。
缺点:无法保留原数组中的元素顺序吗?——会保留第一次出现的顺序,Set 遍历顺序就是插入顺序,因此顺序是保持的。所以一般没有缺点。但注意:Set 去重使用“SameValueZero”比较,认为NaN与自身相等,而===不认为相等;在字符串数组中基本无影响。


2. 利用filter+indexOf

通过数组自身的filter方法,配合indexOf检测当前元素第一次出现的位置是否等于当前索引。

constarr=['apple','banana','apple','orange','banana'];constunique=arr.filter((item,index)=>arr.indexOf(item)===index);console.log(unique);// ['apple', 'banana', 'orange']

优点:兼容性非常好(ES5 即可),语义清晰。
缺点indexOf会从头遍历数组,整体时间复杂度 O(n²),在大型数组上性能较差。同时indexOf无法正确查找NaN,但字符串数组通常无此问题。


3. 利用reduce累加器

通过reduce构建新数组,判断当前元素是否已存在于累加器中。

constarr=['apple','banana','apple','orange','banana'];constunique=arr.reduce((acc,cur)=>{if(!acc.includes(cur)){acc.push(cur);}returnacc;},[]);console.log(unique);// ['apple', 'banana', 'orange']

优点:逻辑直观,可灵活扩展。
缺点includes也是遍历,时间复杂度 O(n²);同时includes能处理NaN但字符串场景无影响。


4. 利用对象/Map 作为哈希表(性能最优)

使用Map或普通对象记录已出现的元素,一次遍历即可,时间复杂度 O(n)。

constarr=['apple','banana','apple','orange','banana'];constmap=newMap();constunique=arr.filter(item=>{if(map.has(item))returnfalse;map.set(item,true);returntrue;});console.log(unique);// ['apple', 'banana', 'orange']

用对象也可以,但对象键会被转为字符串,对于纯字符串数组没问题,但若数组中包含数字或其他类型,需注意类型转换。

constobj={};constunique=arr.filter(item=>obj.hasOwnProperty(item)?false:(obj[item]=true));

优点:线性时间复杂度,适合大数据量。
缺点:代码略复杂。


5. 进阶:保持首次出现顺序 + 去重

上述所有方法中,除了Setfilter+indexOf默认保持顺序,其余若稍加调整也能保持顺序。SetMap本身也是按插入顺序迭代,因此上述基于SetMap的方案自然保持顺序。


总结

  • 日常开发:推荐使用[...new Set(arr)],代码最简洁,性能也不错。
  • 需要兼容极旧环境(如 IE):可用filter+indexOf
  • 大数据量且对性能有极致要求:用Map哈希表方式。

注意,以上方法不仅适用于字符串数组,同样适用于数字、混合类型数组,但去重逻辑是基于严格相等(或Set的 SameValueZero)。对于对象数组,则需要根据对象的某个属性去重,以上方法需配合map提取属性值再进行去重。

http://www.jsqmd.com/news/378256/

相关文章:

  • 马年 Go 篇:高并发企微机器人开发实战
  • 基于机器学习的股票价格预测模型研究毕设
  • 基于机器学习的情感分析系统设计与实现毕设源码
  • 4款语音转写工具测评:告别手动记录,提升工作效率
  • 食品行业精细化管理:从费控到产销的协同落地
  • 2026年天津餐厅管道疏通电话靠谱公司揭秘 - 工业设备
  • 2026年企业CRM系统选型攻略:10款主流产品场景化深度剖析 - 毛毛鱼的夏天
  • 基于机器学习的智能客服系统设计与实现毕业设计源码
  • Leetcode 279. 完全平方数 (Day 29) JavaScript
  • [LangGrpah] MapReduce
  • 基于机器学习的自然语言处理模型优化毕业设计源码
  • 宝宝面霜排行榜TOP5实测:5款好物适配不同宝宝肌肤需求 - 速递信息
  • 河北龙鹏好不好,注塑尼龙油壬靠谱品牌推荐 - mypinpai
  • QA之一 -- 常见测试类型和测试环境
  • 基于机器学习的自动驾驶路径规划算法研究毕设
  • 省心了! 降AIGC平台 千笔 VS PaperRed,专为本科生定制!
  • 性能提升 4 倍的背后:IoTDB 系统调优方法与五个真实案例
  • 2026年六大主流CRM品牌深度剖析:选型指南助企业精准匹配需求 - 毛毛鱼的夏天
  • 探讨2026年专业的塑料制品供应商,哪家服务好又实惠 - 工业品网
  • 嵌入层扩展:超越混合专家模型的高效路径
  • 2026年评价高的球墨铸铁篦子,铸铁雨水口厂家专业评测推荐榜 - 品牌鉴赏师
  • 如何选购GEO优化服务,西安布道传播是靠谱之选 - 工业推荐榜
  • 2026年中国CRM市场十大核心品牌盘点:适配不同行业的业务赋能中枢选型指南 - 毛毛鱼的夏天
  • 2026年起重机械行业权威推荐:南充鼎力起重机械领衔区域龙头,5家优质行车厂家榜单 - 深度智识库
  • 2026年比较不错的礼品卡供应企业盘点,看看有哪些 - 工业品牌热点
  • 2026年渭南、咸阳地区互联网营销公司推荐,西安布道传播公司服务质量如何 - 工业品牌热点
  • 2026年热门的防盗铸铁井盖,球墨铸铁井盖厂家实力推荐榜 - 品牌鉴赏师
  • 2026年深圳地区会议策划服务排名,哪家靠谱又性价比高 - myqiye
  • 替代Element UI:在Vue中优雅实现带分钟步长的HH:mm时间选择器
  • 南通诺丁山宴会厅用于婚宴、订婚宴,价格合适吗? - 工业品牌热点