新闻中心

J*aScript数组去重的十种高效方法_j*ascript技巧

2025-11-06
浏览次数:
返回列表
使用Set去重最简洁高效,适用于基本类型;2. filter+indexOf兼容性好但性能较差;3. forEach+Object利用键值记录,需注意类型转换问题;4. Map方式更安全可靠,支持任意键类型;5. reduce函数式风格清晰但性能一般;6. 排序后比较节省空间但改变顺序;7. JSON.stringify用于对象数组去重但有局限性;8. 根据属性如id去重最常用且灵活;9. 双重循环适合理解原理但效率低;10. 利用Symbol或WeakMap可实现更高级去重。

javascript数组去重的十种高效方法_javascript技巧

J*aScript数组去重是开发中常见的需求,尤其在处理用户输入、接口返回数据或集合操作时。下面介绍十种高效且实用的数组去重方法,涵盖基础类型与引用类型的不同场景,帮助你在不同情况下选择最合适的方式。

1. 使用 Set 去重(最简洁)

ES6 引入的 Set 数据结构自动保证元素唯一性,结合扩展运算符可快速实现去重。

const unique = [...new Set(arr)];

适用于基本类型(number、string、boolean),代码最短,性能优秀。

2. filter + indexOf(兼容性好)

利用 indexOf 返回第一个匹配项的索引,判断当前项是否首次出现。

arr.filter((item, index) => arr.indexOf(item) === index);

适合老浏览器环境,但对长数组性能较差,因 indexOf 是 O(n) 操作。

3. forEach + Object 键值去重(适合基本类型)

使用普通对象作为哈希表记录已出现的值。

let obj = {};
let result = [];
arr.forEach(item => {
  if (!obj[item]) {
    obj[item] = true;
    result.push(item);
  }
});

注意:item 为数字或字符串时有效,true 和 '1' 可能冲突,需谨慎处理类型。

4. Map 记录唯一值(推荐用于复杂判断)

Map 支持任意类型键值,比 Object 更安全。

const map = new Map();
const result = [];
arr.forEach(item => {
  if (!map.has(item)) {
    map.set(item, true);
    result.push(item);
  }
});

比 Object 方式更可靠,尤其在涉及多种数据类型时。

5. reduce 实现去重(函数式风格)

使用 reduce 累积唯一值。

arr.reduce((acc, cur) => {
  if (!acc.includes(cur)) acc.push(cur);
  return acc;
}, []);

代码清晰,但 includes 遍历导致性能一般,适合小数组。

6. 排序后相邻比较(节省空间)

先排序,再比较相邻元素。

BrandCrowd BrandCrowd

一个在线Logo免费设计生成器

BrandCrowd 200 查看详情 BrandCrowd arr
  .slice()
  .sort()
  .filter((item, index, array) => index === 0 || item !== array[index - 1]);

修改了顺序,不适合要求保持原序的场景,但空间利用率高。

7. 去重对象数组:JSON.stringify + Set

对对象数组可通过序列化判断是否重复。

[...new Set(arr.map(JSON.stringify))].map(JSON.parse);

简单粗暴,但属性顺序影响结果,且含函数或 undefined 会失败,慎用。

8. 根据对象特定属性去重

例如根据 id 去除重复对象。

const seen = new Set();
arr.filter(item => {
  if (seen.has(item.id)) return false;
  seen.add(item.id);
  return true;
});

实际项目中最常用方式之一,灵活可控。

9. 双重循环 + 标志位(手动控制)

传统方式,适合学习理解原理。

let result = [];
for (let i = 0; i   let isDuplicate = false;
  for (let j = 0; j     if (arr[i] === result[j]) {
      isDuplicate = true;
      break;
    }
  }
  if (!isDuplicate) result.push(arr[i]);
}

时间复杂度高,仅建议用于极小数据集或教学。

10. 利用 Proxy 中间拦截(高级技巧)

可在数据写入过程中实时去重。

const uniqueArray = new Proxy([], {
  set(target, property, value) {
    if (target.includes(value)) return true;
    target[property] = value;
    return true;
  }
});

属于进阶用法,适合需要动态拦截赋值的场景。

基本上就这些。选择哪种方法取决于你的数据类型、性能要求和浏览器支持。多数情况下,Set 是首选方案,简洁高效;对象数组则推荐基于属性的 Map 过滤。不复杂但容易忽略的是数据类型的兼容性和原始顺序的保持。

以上就是J*aScript数组去重的十种高效方法_j*ascript技巧的详细内容,更多请关注其它相关文章!


# 如何用  # 建设工程扣分查询网站  # 黄山网络营销推广哪家好  # 南宫哪里有网站建设列表  # 固始网站建设报价  # 青龙满族自治县网站推广  # seo关键词排名推荐火星系统  # 速卖通seo方法  # 免费seo霸屏推广  # 河南抖音seo怎样收费  # inside seo  # 如何实现  # 性好  # 最常用  # javascript  # 命令行  # 运算符  # 适用于  # 键值  # 数据结构  # 十种  # red  # proxy  # 浏览器  # json  # js  # java  # es6 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: Golang如何优雅处理error_Golang error处理最佳实践总结  Safari自带网页翻译功能怎么用 无需插件轻松看懂外文网站【方法】  如何提高微信支付的安全性_微信支付安全防护与设置建议  UE5.7引擎表现爆炸优化无敌!5090跑4K稳定60FPS  解决 MongoDB 聚合查询中对象数组 _id 匹配问题  漫蛙漫画登录站点 漫蛙2正版漫画快速访问  React/Next.js中实现列表项的动态移动与状态管理:兼论唯一键的重要性  age动漫网站入口 age动漫官网直接访问入口  C++指针和引用有什么区别_C++内存管理核心概念深度解析  机器学习中对数变换预测结果的反向还原  如何高效处理PHP中的Excel数据导入导出?PortPHP/Spreadsheet助你轻松搞定!  Lar*el DB::listen 事件中的查询执行时间单位解析  海棠电脑版入口_通过电脑访问海棠官网阅读  邮政编码查询不到怎么办_邮政编码查询不到的常见原因与对策  解决Tabulator日期时间排序问题的专业指南  C++的std::forward_list怎么用_C++ STL中单向链表容器的特点与应用  知音漫客正版漫画平台_知音漫客官网账号登录  sublime怎么覆盖插件的默认快捷键_sublime快捷键优先级与设置  如何将一个大型PHP应用拆分为多个Composer包_微服务与模块化架构的Composer实践  百度浏览器字体显示异常偏小_百度浏览器字体渲染修复方案  Word2013如何插入视频和音频媒体_Word2013媒体插入的多媒体支持  微信聊天记录怎么加密_微信聊天记录加密方法  QQ邮箱官方网页版登录 QQ邮箱个人邮箱快速访问  高德地图总提示网络异常怎么办 高德地图离线导航设置与网络排查方法  React列表渲染与独立状态管理:避免全局状态影响局部更新  整合Supabase认证与Django模型:跨模式迁移的解决方案  Bilibili动漫最新防封地址发布-Bilibili动漫2025年最稳正版入口推荐  Go语言中JSON数据解析与字段访问教程  win11 Snap Layouts怎么用 Win11窗口布局与分屏多任务高效指南【必学】  qq游戏免费畅玩入口_qq游戏电脑版快速启动  Lar*el Form Request中唯一性验证在更新操作中的正确实现  MAC如何安全彻底地删除文件_MAC使用终端命令确保文件无法被恢复  创客贴用户入口官网登录 创客贴网页版电脑版系统  机构:以往存储涨价周期小米利润率实际上有所改善 能转嫁给消费者等  msn官网入口地址手机版 msn官方网站手机最新链接  怎样使用“本地安全策略”提升Windows安全性_Secpol.msc配置指南【高手】  Basecamp怎样用留言钉固定重点_Basecamp用留言钉固定重点【重点标记】  Gmail邮箱申请注册直达_Gmail邮箱免费注册PC版官网入口2025  LINQ to XML为何解析失败? 深入理解C# XDocument的异常处理  必由学官方网站入口 必由学学生教师共用登录通道  Python:递归比较文件夹内容并找出特定类型文件的差异  Spring Boot内嵌服务器与J*a EE全栈特性:选择与部署策略  php源码怎么在电脑上测试_电脑测试php源码方法步骤【教程】  jQuery Mask 插件中实现电话号码固定前导零的教程  qq邮箱日历功能怎么用_创建日程与会议邀请的技巧  在VS Code中配置和运行Dart程序的完整步骤  c++如何使用折叠表达式(Fold Expressions)_c++17可变参数模板新技巧  PostgreSQL海量数据高效导入策略:Python与Django实践指南  Shopware订单对象中获取产品自定义字段的正确方法  利用5118提升短视频内容效果_5118短视频关键词优化方法 

搜索