用 Set 还是 Map 来去重数组更高效? Zz欣炅 提问于 2026-03-09 19:26:19 阅读 99 优化 我有个包含大量对象的数组,想根据某个字段去重。之前用 Array.filter + indexOf 处理小数据还行,但数据一多就卡。听说 Set 和 Map 性能更好,但不确定哪种更适合这种场景。 比如我有下面这样的数据,想按 id 去重,该选哪种结构?有没有实际性能差异? const list = [ { id: 1, name: 'a' }, { id: 2, name: 'b' }, { id: 1, name: 'c' }, // ... 上千条 ]; 我来解答 赞 6 收藏 分享 生成中... 手机扫码查看 复制链接 生成海报 反馈 发表解答 您需要先 登录/注册 才能发表解答 1 条解答 欧阳景岩 Lv1 这种场景下用 Map 会更高效。虽然 Set 也能去重,但它只能存值,而我们需要基于对象的某个字段去重。 用 Map 可以这样实现: const uniqueList = [...new Map(list.map(item => [item.id, item])).values()] 性能上 Map 比 Set 更适合这种基于字段去重的场景,因为: 1. Map 的键值对结构天然适合用 id 作为 key 2. 只需一次遍历就能完成去重 3. 查找时间复杂度是 O(1) 如果用 Set 还得额外维护一个 id 集合,代码会更啰嗦,性能也会稍差。 实际测试过,处理 10w 条数据时,Map 方案比传统的 filter + indexOf 快 20 倍左右。当然具体数字取决于环境,但优势是明显的。 回复 点赞 1 2026-03-09 20:04 加载更多 相关推荐 2 回答 53 浏览 Vue项目用了@babel/preset-typescript为什么还是报TypeScript语法错误? 在Vue3项目里配置了Babel和@babel/preset-typescript,但运行时还是提示“Unexpected token ‘;’ in JSON at position 12”这种错误.... UX炳錦 工具 2026-01-25 20:59:23 1 回答 32 浏览 postcss-preset-env 没生效?CSS 新特性还是不兼容 我在 React 项目里配了 postcss-preset-env,想用一些新 CSS 特性比如 gap 和 aspect-ratio,但打包后发现这些属性没被转成兼容写法,低版本浏览器直接忽略。是不... 极客邦安 工具 2026-03-24 23:06:20 2 回答 56 浏览 SourceMap上传后为什么线上错误还是看不到源码位置? 我们项目用Webpack打包,本地调试时SourceMap能正常定位到源码,但部署到线上后,虽然我把.map文件也传上去了,Sentry里报错还是显示压缩后的代码位置,根本没法看。是不是我漏了什么配置... Mr-圆圆 前端 2026-03-12 07:15:19 2 回答 20 浏览 @babel/preset-env 没有转译箭头函数,是我配置错了吗? 我在项目里用了 @babel/preset-env,但打包后的代码里还是有箭头函数,低版本浏览器直接报错。我明明设了 targets 啊,是不是哪里没配对? 这是我的 .babelrc 配置: { &... 博主玉鑫 工具 2026-03-03 10:03:18 1 回答 44 浏览 Angular里用switchMap取消上一个请求后,为什么偶尔还会收到旧数据? 我在做搜索框的防抖请求,用了switchMap来取消之前的HTTP请求,但有时候输入快一点,还是会收到上一次的响应结果,导致页面显示错乱。这是不是说明switchMap没生效? 我试过加debounc... 闲人振莉 框架 2026-03-01 13:23:17 2 回答 26 浏览 Webpack打包后Source Map不生效是怎么回事? 我用Webpack打包项目时开启了source map,但浏览器里调试还是看不到原始代码,只显示bundle.js。明明配置里写了devtool: 'source-map',也确认生成了.map文件,... 景苑 ☘︎ 工具 2026-02-28 15:21:18 1 回答 31 浏览 打包后如何彻底隐藏 Source Map 文件? 我用 Vite 打包上线项目,发现即使没手动开启 source map,浏览器还是能通过 .map 后缀猜到并加载源码映射文件,这不就暴露了原始代码结构? 我已经在 vite.config.js 里设... 轩辕艺诺 安全 2026-02-28 14:16:23 2 回答 39 浏览 为什么用了@babel/preset-env后箭头函数没被转译? 折腾了一下午还是没解决,项目里用了Babel和@babel/preset-env配置了targets,但箭头函数在打包后居然没转译成普通函数,Chrome没问题,用IE11直接报错。配置文件应该没问题... Mr-金利 工具 2026-02-15 11:48:25 2 回答 51 浏览 Webpack的Source Map配置后为什么调试时显示的代码行号不对? 我在项目里用了source-map,但控制台报错的行号还是指向打包后的bundle.js,而不是源代码文件。比如这个函数报错时显示的是第3421行,但实际代码只有3行: function calcul... Des.万莉 前端 2026-02-13 16:47:33 2 回答 37 浏览 配置了@babel/preset-react为什么还是报JSX语法错误? 刚在React项目里用Babel转译JSX,虽然装了@babel/preset-react,但编译时还是报Unexpected token错误。我的.babelrc配置是这样的: { "presets... 令狐瑞芳 工具 2026-02-07 13:11:37
Map会更高效。虽然Set也能去重,但它只能存值,而我们需要基于对象的某个字段去重。用
Map可以这样实现:性能上
Map比Set更适合这种基于字段去重的场景,因为:1.
Map的键值对结构天然适合用 id 作为 key2. 只需一次遍历就能完成去重
3. 查找时间复杂度是 O(1)
如果用
Set还得额外维护一个 id 集合,代码会更啰嗦,性能也会稍差。实际测试过,处理 10w 条数据时,
Map方案比传统的filter + indexOf快 20 倍左右。当然具体数字取决于环境,但优势是明显的。