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

JavaScript 中,数组去重

在 JavaScript 中,数组去重有多种实现方式,以下是常见的几种方法,适用于不同场景:

1. 使用 Set(最简洁,ES6+)

Set 是 ES6 新增的数据结构,其特性是成员唯一,结合数组扩展运算符 ... 可快速去重。
优点:简洁高效,一行代码搞定。
缺点:无法处理引用类型(如对象、数组)的去重(因为引用类型地址不同)。

const arr = [1, 2, 2, 3, 3, 3, null, null, undefined, undefined, NaN, NaN];
const uniqueArr = [...new Set(arr)]; 
// 结果:[1, 2, 3, null, undefined, NaN]
// 注意:Set 能正确识别 NaN(认为 NaN === NaN)

2. 使用 filter + indexOf

利用 indexOf 返回元素首次出现的索引,结合 filter 保留首次出现的元素。
优点:兼容性较好(ES5+)。
缺点

  • 无法处理 NaN(因为 indexOf(NaN) 始终返回 -1,会过滤掉所有 NaN)。
  • 性能一般(嵌套遍历)。
const arr = [1, 2, 2, 3, 3, null, null, NaN, NaN];
const uniqueArr = arr.filter((item, index) => {return arr.indexOf(item) === index; 
});
// 结果:[1, 2, 3, null](NaN 被过滤掉了)

3. 使用 filter + includes(改进 indexOf 的 NaN 问题)

includes 能正确识别 NaN[NaN].includes(NaN) === true),可修复上一种方法的缺陷。
优点:支持 NaN 去重。
缺点:仍需嵌套遍历,性能一般。

const arr = [1, 2, 2, 3, 3, null, null, NaN, NaN];
const uniqueArr = [];
arr.filter(item => {if (!uniqueArr.includes(item)) {uniqueArr.push(item);return true;}return false;
});
// 结果:[1, 2, 3, null, NaN]

4. 使用对象键名(利用对象属性唯一)

通过对象的键名存储已出现的元素(键名自动去重),适用于简单类型。
优点:性能较好(对象查找是 O(1))。
缺点

  • 需注意数据类型转换(如 '1'1 会被视为同一个键)。
  • 无法直接处理 nullundefined(可手动处理键名)。
const arr = [1, 2, 2, 3, 3, '1', null, null];
const obj = {};
const uniqueArr = [];
arr.forEach(item => {// 处理键名,避免类型混淆(如区分 1 和 '1')const key = typeof item + item; if (!obj[key]) {obj[key] = true;uniqueArr.push(item);}
});
// 结果:[1, 2, 3, '1', null](正确区分了 1 和 '1')

5. 使用 reduce 实现

reduce 可累计去重后的数组,逻辑类似 filter + includes
优点:代码简洁,支持 NaN
缺点:性能依赖内部判断逻辑。

const arr = [1, 2, 2, 3, 3, null, null, NaN, NaN];
const uniqueArr = arr.reduce((prev, curr) => {if (!prev.includes(curr)) {prev.push(curr);}return prev;
}, []); 
// 结果:[1, 2, 3, null, NaN]

6. 针对引用类型去重(如对象数组)

如果数组包含对象/数组等引用类型,需根据具体属性判断唯一性(例如根据 id 去重)。

const arr = [{ id: 1, name: 'a' },{ id: 2, name: 'b' },{ id: 1, name: 'a' } // 重复(id 相同)
];// 根据 id 去重
const uniqueArr = [];
const ids = new Set(); // 存储已出现的 id
arr.forEach(item => {if (!ids.has(item.id)) {ids.add(item.id);uniqueArr.push(item);}
});
// 结果:[{ id: 1, name: 'a' }, { id: 2, name: 'b' }]

总结

  • 简单类型去重:优先用 [...new Set(arr)](简洁高效)。
  • 需要兼容旧环境:用 filter + indexOf(注意 NaN 问题)。
  • 引用类型去重:根据具体属性(如 id)结合 Set 或对象判断。
http://www.dtcms.com/a/525057.html

相关文章:

  • JavaScript深入之函数组合详解
  • Serverless 应用引擎 SAE:为传统应用托底,为 AI 创新加速
  • Edge-TTS+Cloudflare Worker:免费 TTS 服务搭建指南,支持 API 调用与低代码集成
  • 企业建网站平台找人做购物网站
  • 【javaFX基础】 “Not on FX application thread; currentThread = Thread-3“问题解决方法
  • 专业的网站开发服务window2008 网站建设
  • Linux 查找文件
  • 法术施放选择目标逻辑概述
  • 后台管理网站开发找客户在公司做网站
  • 做游戏陪玩网站江苏省建设厅的官方网站
  • 青岛科技大学《Nano Res.》:0.5秒合成双单原子催化剂!锌空电池稳定运行650小时,氯碱电解效率达97%
  • 力扣 11. 盛最多水的容器 - Java版
  • 狗和人做网站旅游网站框架
  • 网站搭建公司排行榜网站要求
  • n8n网页抓取自动化完整指南
  • Alpine Linux:轻量、安全与高效的Linux发行版
  • 第四章、路由配置
  • Node.js:JavaScript的服务器端革命
  • C++动态内存管理详解:new/delete与malloc/free深度对比
  • 危险网站提示门户网站是如何做引流的
  • 网站代码怎么打开清风网站建设
  • Spring Boot 1.x、2.x 3.x区别汇总
  • 房产网站建设接单公关策划书模板范文
  • three.js加载三维GLB文件,查看三维模型
  • 在Linux中以root的身份进入GNOME桌面
  • 国内wordpress主题网站广元建设网站
  • 做网站哪家便宜搭建网站需要什么技能
  • 网站打不开第二天不收录啦好用的建站系统
  • 前端实现大文件上传全流程详解
  • pom.xml文件中io.swagger的swagger-bootstrap-ui和springfox-bean-validators未找到