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

数组去重方法

✅ 一、最简单(推荐首选)

👉 使用Set(ES6)

const arr = [1, 2, 2, 3, 4, 4]; const result = [...new Set(arr)]; console.log(result); // [1, 2, 3, 4]

✔ 优点:

  • 写法最简洁

  • 性能好(接近 O(n))

✔ 缺点:

  • 无法处理对象去重(引用不同)


✅ 二、使用filter

const arr = [1, 2, 2, 3, 4, 4]; const result = arr.filter((item, index) => { return arr.indexOf(item) === index; }); console.log(result);

✔ 原理:

  • 只保留第一次出现的位置

❗ 缺点:

  • 性能较差(O(n²))


✅ 三、使用reduce

const arr = [1, 2, 2, 3, 4, 4]; const result = arr.reduce((acc, cur) => { if (!acc.includes(cur)) { acc.push(cur); } return acc; }, []); console.log(result);

✔ 适合理解函数式编程


✅ 四、使用Map(推荐处理复杂数据)

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

✔ 优点:

  • 性能好

  • 可扩展(对象去重)


🚀 五、对象数组去重(面试重点🔥)

👉 按某个字段去重

const arr = [ { id: 1, name: 'a' }, { id: 1, name: 'b' }, { id: 2, name: 'c' } ]; const map = new Map(); const result = arr.filter(item => { if (!map.has(item.id)) { map.set(item.id, true); return true; } return false; }); console.log(result);

🧠 六、终极通用写法(封装函数)

function unique(arr, key) { const map = new Map(); return arr.filter(item => { const value = key ? item[key] : item; if (!map.has(value)) { map.set(value, true); return true; } return false; }); }

使用👇

unique([1, 2, 2, 3]); unique([{id:1},{id:1}], 'id');

⚠️ 七、面试加分点(必须知道)

1️⃣Set去重不了对象

[{a:1}, {a:1}] // ❌ 还是两个

原因:
👉 引用地址不同


2️⃣ 性能排序(面试常问)

方法时间复杂度
Set⭐ O(n)
Map⭐ O(n)
filter❌ O(n²)
includes❌ O(n²)

3️⃣ 特殊值问题

NaN === NaN // false

👉 但:

new Set([NaN, NaN]) // ✅ 只保留一个

✍️ 总结一句话

👉简单数据用 Set,复杂数据用 Map,面试优先讲这两个

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

相关文章:

  • AI革命VS人类危机?OpenClaw用技术给出答案
  • 基于大模型的生成式信息抽取:优势与实践路径
  • # 发散创新:Playwright 实战自动化测试新范式——从基础到高级技巧全解析在现代前端开发中,**浏览器自动
  • 2026年普通人创业副业全指南:零门槛稳赚项目盘点 - 格行官方招商总部
  • Gerbv:革新性PCB制造文件验证的开源解决方案
  • 2026年效率革命:方便面自动化抓取解决方案与品牌指南 - 品牌2026
  • BROADCOM博通集成 Matter 1.5平台认证就绪、BK7239N等芯片助力智能家居无缝融合
  • UniApp 小程序获取微信手机号完整笔记(Vue3 + TS)
  • 昇腾MindSpore实战经验分享:从入门到工业级部署的全方位指南
  • Graphormer开源模型教程:Python API调用app.py实现批量SMILES预测
  • 3分钟搭建你的微信智能管家:零代码实现24小时自动回复
  • 再做一个RAG 生成增强系统时,选Redis 还是 Milvus?
  • 2026年生鲜分拣升级:高效稳定果蔬机械手供应商推荐 - 品牌2026
  • 淄博辰达保温材料好用吗,施工难度大不大,价格贵不贵? - 工业品牌热点
  • 从入门到精通:如何写好 Agent Skill 技术文档
  • 山东大学2022-2023学期实时绘制期末考试真题(回忆版)
  • Git 提交规范总结
  • 运动粘度仪售后哪家好?服务与维保对比 - 品牌推荐大师
  • 农田代谢的碳密码:物理农业重构生态经济循环
  • 让大模型学会“开卷考试”:一文看懂什么是 RAG
  • Teensy USB主机协议栈USBHost_t36深度解析
  • 2026年度全国移动厕所及配套产品品牌综合测评报告 - 深度智识库
  • ComfyUI-Manager:AI绘画工作流的插件生态治理解决方案
  • SpringCloud进阶--MySQL主从复制、分库分表、读写分离的实现
  • WindowResizer:打破窗口限制,实现Windows窗口自由调整的终极解决方案
  • WPF新手村教程(七)—— 终章(MVVM架构初见杀)
  • 一体化数字引擎 驱动机械设备非标项目精益盈
  • 2026/4/3 函数模板与类模板
  • Google Stitch + MCP:AI 时代的“设计即代码“新范式
  • 今天使用trae进行代码开发的一点点小感触