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

ES6的Set数据结构:从数组去重到高效数据管理

1. 为什么你需要了解Set数据结构第一次遇到数组去重问题时我像大多数新手一样写了这样的代码function unique(arr) { let result []; for (let i 0; i arr.length; i) { if (result.indexOf(arr[i]) -1) { result.push(arr[i]); } } return result; }直到有一天项目里有个10万条数据的数组需要去重这段代码直接让页面卡死了5秒。这就是我转向Set数据结构的转折点。用Set改造后function unique(arr) { return [...new Set(arr)]; }同样的数据量执行时间从5秒降到了50毫秒性能提升了100倍这就是ES6的Set数据结构给我的震撼教育。Set本质上是一种集合类型它最大的特点就是所有元素都是唯一的。想象你有一个装彩色球的盒子Set就像是个智能盒子当你试图放入两个颜色相同的球时它会自动过滤掉重复的球。这种特性让它在处理唯一性数据时特别高效。与数组相比Set有几个显著优势查找速度更快判断元素是否存在的时间复杂度是O(1)而数组的indexOf是O(n)自动去重添加重复元素时不会报错只是静默忽略更语义化当你要处理的数据本身就是数学上的集合概念时用Set比用数组更符合直觉2. Set的基本操作从创建到增删改查2.1 创建和初始化Set创建Set有三种常见方式// 1. 创建空Set const emptySet new Set(); // 2. 用数组初始化 const numSet new Set([1, 2, 3, 4]); // 3. 用字符串初始化会自动拆分为字符 const charSet new Set(hello); console.log(charSet); // Set(4) {h, e, l, o}实际项目中我经常用第三种方式快速获取字符串中的唯一字符。比如统计用户输入的所有不重复标签const tags 科技,互联网,人工智能,科技,AI; const uniqueTags [...new Set(tags.split(,))]; console.log(uniqueTags); // [科技, 互联网, 人工智能, AI]2.2 增删查操作Set的API设计得非常简洁主要方法就四个const mySet new Set(); // 添加元素 mySet.add(1).add(2).add(3); // 可以链式调用 // 检查存在 console.log(mySet.has(2)); // true // 删除元素 mySet.delete(2); console.log(mySet.has(2)); // false // 清空集合 mySet.clear(); console.log(mySet.size); // 0这里有个实用技巧因为add()方法返回Set本身所以可以链式调用。这在批量添加数据时特别方便const set new Set() .add(苹果) .add(香蕉) .add(橙子);2.3 大小和类型判断Set的size属性可以获取元素数量这比数组的length更准确因为它已经自动去重了const dupArr [1, 2, 2, 3, 3, 3]; console.log(dupArr.length); // 6 console.log(new Set(dupArr).size); // 3关于类型判断有个特殊点需要注意在Set中NaN被视为相同的值const set new Set(); set.add(NaN); set.add(NaN); console.log(set.size); // 1这是Set为数不多的例外情况因为在JavaScript中NaN NaN的结果是false但Set内部做了特殊处理。3. Set的高级应用不只是数组去重3.1 复杂数据结构的去重方案虽然Set不能直接处理对象去重但配合JSON.stringify可以解决简单对象去重问题const objArr [ {id: 1, name: 张三}, {id: 2, name: 李四}, {id: 1, name: 张三} ]; const uniqueObjArr [ ...new Map( objArr.map(obj [JSON.stringify(obj), obj]) ).values() ];对于更复杂的场景比如要根据某个属性去重可以这样处理const users [ {id: 1, name: Alice}, {id: 2, name: Bob}, {id: 1, name: Alice} ]; const uniqueUsers [ ...new Map(users.map(user [user.id, user])).values() ];3.2 集合运算的实现利用Set可以轻松实现数学上的集合运算// 并集 function union(setA, setB) { return new Set([...setA, ...setB]); } // 交集 function intersection(setA, setB) { return new Set([...setA].filter(x setB.has(x))); } // 差集 function difference(setA, setB) { return new Set([...setA].filter(x !setB.has(x))); }这些方法在处理标签系统、权限系统时特别有用。比如获取用户新增的权限const oldPermissions new Set([read, write]); const newPermissions new Set([read, delete]); const added difference(newPermissions, oldPermissions); console.log(added); // Set(1) {delete}3.3 性能敏感场景的应用在需要频繁检查元素是否存在的场景Set的性能优势非常明显。比如实现一个敏感词过滤系统const sensitiveWords new Set([暴力, 色情, 政治]); function containsSensitiveWord(text) { return text.split().some(word sensitiveWords.has(word)); }根据我的测试当敏感词库达到10万条时Set方案的性能仍然是数组方案的100倍以上。4. Set的遍历与转换4.1 多种遍历方式对比Set提供了四种遍历方法各有适用场景const colorSet new Set([red, green, blue]); // 1. for...of直接遍历 for (const color of colorSet) { console.log(color); } // 2. forEach方法 colorSet.forEach((value, _valueAgain, set) { console.log(value); }); // 3. 获取迭代器 const iterator colorSet.values(); console.log(iterator.next().value); // red // 4. 转换为数组后遍历 [...colorSet].map(color console.log(color));需要注意的是Set的forEach回调函数有三个参数前两个都是当前元素的值这是为了保持与Map的API一致性。4.2 与其他数据结构的转换Set与数组的转换是最常见的操作// Set转数组 const set new Set([1, 2, 3]); const arr1 [...set]; const arr2 Array.from(set); // 数组转Set const newSet new Set([1, 2, 3]);更复杂的转换场景包括// Set转Map const setToMap new Map([...mySet].map(item [item, item])); // Map转Set const mapToSet new Set(myMap.values());4.3 实际案例实现一个投票系统假设我们要实现一个防止重复投票的系统class VotingSystem { constructor() { this.voters new Set(); this.votes new Map(); } vote(voterId, candidate) { if (this.voters.has(voterId)) { console.log(您已经投过票了); return false; } this.voters.add(voterId); this.votes.set(candidate, (this.votes.get(candidate) || 0) 1); return true; } getResults() { return [...this.votes.entries()]; } }这个实现利用了Set来高效检查重复投票比用数组方案要高效得多。

相关文章:

ES6的Set数据结构:从数组去重到高效数据管理

1. 为什么你需要了解Set数据结构 第一次遇到数组去重问题时&#xff0c;我像大多数新手一样写了这样的代码&#xff1a; function unique(arr) {let result [];for (let i 0; i < arr.length; i) {if (result.indexOf(arr[i]) -1) {result.push(arr[i]);}}return result;…...

springboot基于SpringBoot的艺术作品展示平台_z50di044_zl085

前言 在数字化浪潮推动下&#xff0c;艺术作品的传播与展示方式正经历深刻变革。传统艺术展览受限于场地、时间和地域&#xff0c;难以满足广大艺术爱好者和创作者的需求。基于SpringBoot的艺术作品展示平台旨在打破这些限制&#xff0c;构建一个集作品展示、交流互动、艺术教育…...

如何高效使用Adobe-GenP 3.0:专业用户的Adobe Creative Cloud完整破解指南

如何高效使用Adobe-GenP 3.0&#xff1a;专业用户的Adobe Creative Cloud完整破解指南 【免费下载链接】Adobe-GenP Adobe CC 2019/2020/2021/2022/2023 GenP Universal Patch 3.0 项目地址: https://gitcode.com/gh_mirrors/ad/Adobe-GenP Adobe-GenP 3.0是一款强大的A…...

FEKO中地平面类型与计算参数的高级配置指南

1. FEKO地平面类型详解与选择策略 第一次用FEKO做电磁仿真时&#xff0c;我被地平面选项搞得一头雾水——明明都是模拟地面效应&#xff0c;为什么要有三种不同配置&#xff1f;后来在调试一个车载天线模型时&#xff0c;自由空间和Sommerfeld积分的结果差异竟然达到15dB&#…...

解密Funannotate:如何让真核基因组注释从繁琐到优雅

解密Funannotate&#xff1a;如何让真核基因组注释从繁琐到优雅 【免费下载链接】funannotate Eukaryotic Genome Annotation Pipeline 项目地址: https://gitcode.com/gh_mirrors/fu/funannotate 你是否曾面对真核基因组注释的复杂流程感到束手无策&#xff1f;当需要整…...

March7thAssistant:解放你的游戏时间,让《崩坏:星穹铁道》自动化管理

March7thAssistant&#xff1a;解放你的游戏时间&#xff0c;让《崩坏&#xff1a;星穹铁道》自动化管理 【免费下载链接】March7thAssistant 崩坏&#xff1a;星穹铁道全自动 三月七小助手 项目地址: https://gitcode.com/gh_mirrors/ma/March7thAssistant 你是否曾因忙…...

AI存储数据生命周期管理系统功率MOSFET选型方案:高效可靠电源与热管理驱动适配指南

随着人工智能与大数据技术的飞速发展&#xff0c;AI存储数据生命周期管理系统已成为数据中心与边缘计算节点的核心基础设施。其电源管理、风扇散热及模块化控制电路作为系统“能量与体温调节中枢”&#xff0c;需为存储阵列、计算单元、散热风扇等关键负载提供精准、高效且可靠…...

忍者像素绘卷惊艳效果:‘神罗天征’冲击波——同心圆像素扩散算法可视化

忍者像素绘卷惊艳效果&#xff1a;神罗天征冲击波——同心圆像素扩散算法可视化 1. 视觉震撼&#xff1a;像素艺术的巅峰呈现 当传统像素艺术遇上现代AI技术&#xff0c;忍者像素绘卷创造出了令人惊叹的视觉效果。这款基于Z-Image-Turbo深度优化的图像生成工作站&#xff0c;…...

04月15日AI每日参考:Stanford AI指数报告揭示Agent时代来临,Google I/O确认5月举行

今日概览今天有两件事值得重点关注。Stanford HAI发布2026年AI指数报告&#xff0c;数据显示AI Agent已能完成66%的真实世界计算机任务&#xff0c;中美AI差距基本消除——这不是预测&#xff0c;是已发生的事实。与此同时&#xff0c;Google确认I/O大会5月19-20日举行&#xf…...

从Material Design 3实战出发:用Dynamic Color和Material You主题系统重构你的Android暗黑模式

Material Design 3实战&#xff1a;用Dynamic Color重构Android暗黑模式体验 深夜刷手机时&#xff0c;你是否曾被刺眼的亮色界面晃得睁不开眼&#xff1f;随着Android 12引入Material You设计语言&#xff0c;暗黑模式已从简单的颜色反转进化为与系统深度联动的个性化体验。本…...

AIAgent追踪性能暴跌87%?立即启用这5个轻量级Trace增强探针(已通过LLM-Ops生产环境压测验证)

第一章&#xff1a;AIAgent架构全链路追踪方案 2026奇点智能技术大会(https://ml-summit.org) 在复杂AIAgent系统中&#xff0c;任务常跨多个模块&#xff08;如规划器、工具调用器、记忆检索器、LLM执行器&#xff09;动态流转&#xff0c;传统日志或单点埋点难以还原端到端行…...

信号与系统分析2026(春季)作业参考答案 - 第一次作业

信号与系统2025&#xff08;春季&#xff09;作业要求及参考答案汇总信号与系统2026&#xff08;春季&#xff09;作业要求及参考答案汇总 01 基础作业一、绘制信号波形 1、必做题...

HCIA作业

第一步&#xff1a;将拓扑图分成三个架构 (学校内网&#xff0c;运营商&#xff0c;百度网络)&#xff0c;再着眼于其中一个架构第二步&#xff1a; 将学校内网分成两个部分&#xff1a;1.二层交换机 2.三层路由器 【先配二层再做三层】2.1&#xff1a;配置交换机&#xff1…...

蒸馏后的AIAgent响应延迟仍超800ms?这5个被92%团队忽略的推理缓存协同优化点必须立即修复

第一章&#xff1a;蒸馏后的AIAgent响应延迟仍超800ms&#xff1f;这5个被92%团队忽略的推理缓存协同优化点必须立即修复 2026奇点智能技术大会(https://ml-summit.org) 当模型蒸馏已将参数量压缩47%&#xff0c;但端到端P99延迟仍卡在823ms&#xff0c;问题往往不在模型本身—…...

终极指南:用OpenCore Legacy Patcher为旧款Mac注入新生命

终极指南&#xff1a;用OpenCore Legacy Patcher为旧款Mac注入新生命 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher OpenCore Legacy Patcher是一款革命性的…...

004、规划模块(一):目标分解与任务规划基础

上周调一个机器人导航Agent&#xff0c;遇到个典型问题&#xff1a;我给它下指令“去三楼会议室拿一份资料”&#xff0c;结果这家伙直接往三楼冲&#xff0c;到了才发现会议室门锁着&#xff0c;又折回来找我要钥匙。整个过程像极了刚入行的程序员——只盯着最终目标&#xff…...

千问3.5-2B助力嵌入式开发:智能调试与日志分析

千问3.5-2B助力嵌入式开发&#xff1a;智能调试与日志分析 1. 嵌入式开发的调试痛点 在STM32等嵌入式系统开发中&#xff0c;调试过程往往充满挑战。想象一下这样的场景&#xff1a;设备突然异常重启&#xff0c;控制台输出长达数百行的日志信息&#xff0c;其中混杂着硬件中…...

别再用LiveCD了!用Ventoy制作Ubuntu急救盘一键扩容根目录(支持22.04/20.04)

Ventoy革命&#xff1a;告别传统LiveCD&#xff0c;打造智能Ubuntu急救与扩容解决方案 在Linux系统维护领域&#xff0c;传统LiveCD方式已经服务我们近二十年&#xff0c;但它的局限性日益明显——每个ISO需要独占一个U盘&#xff0c;版本更新导致工具集不兼容&#xff0c;操作…...

乙巳马年春联生成终端生产环境:Kubernetes集群高可用部署架构

乙巳马年春联生成终端生产环境&#xff1a;Kubernetes集群高可用部署架构 1. 项目背景与挑战 想象一下&#xff0c;你开发了一款非常受欢迎的AI应用——一个能根据用户输入的关键词&#xff0c;自动生成充满艺术感和节日氛围的春联的Web应用。用户只需输入“如意”、“飞跃”…...

思源宋体7款字重终极指南:从零基础到专业排版的完整解决方案

思源宋体7款字重终极指南&#xff1a;从零基础到专业排版的完整解决方案 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 还在为中文设计寻找既专业又免费的字体资源吗&#xff1f;思源…...

005、大模型基础:AI 应用开发者真正需要懂什么,才不至于只会调接口

很多开发者在接触 AI 应用开发时,最开始都会有一种错觉: 只要我会调用模型接口,会写几句 Prompt,会把结果展示到页面上,我是不是就已经算会做 AI 应用了? 短期看,这样当然能做出一点东西。 你可以很快接一个接口,做一个聊天框,甚至做一个会议总结、文章润色、知识问答…...

终极指南:如何用SillyTavern打造你的专属AI聊天伴侣

终极指南&#xff1a;如何用SillyTavern打造你的专属AI聊天伴侣 【免费下载链接】SillyTavern LLM Frontend for Power Users. 项目地址: https://gitcode.com/GitHub_Trending/si/SillyTavern SillyTavern是一款专为高级用户设计的LLM前端工具&#xff0c;它让你能够创…...

别再到处找免费股票数据了!实测可用:Python/JS/Java调用StockAPI获取K线、Level2实时行情保姆级教程

实战指南&#xff1a;用StockAPI高效获取股票数据的多语言解决方案 在金融科技和量化交易领域&#xff0c;获取准确、实时的股票数据是每个开发者面临的第一个挑战。市面上充斥着各种号称"免费"的数据源&#xff0c;但真正稳定可用的却寥寥无几。StockAPI.com.cn作为…...

特征融合神操作,拿下Nature!

特征融合全新范式&#xff0c;拿下Nature子刊&#xff01;作者提出了一种领域知识嵌入的多层级特征融合方法&#xff0c;突破了深度学习大数据黑箱的路径依赖&#xff0c;为小样本、高纬度、多模态等场景提供了全新的思路。不仅在各大顶会上也涌现了不少新玩法。比如CVPR26上的…...

别再只用基础图形了!用Cesium自定义材质给你的3D地图加点‘特效’:扫描线动画完整开发指南

突破视觉边界&#xff1a;Cesium自定义材质开发实战指南 当标准的地形渲染和基础几何体无法满足你的创意需求时&#xff0c;Cesium的材质系统就像一把打开新世界的钥匙。想象一下&#xff0c;你的3D地图上不仅有静态的建筑和道路&#xff0c;还有流动的光影、脉动的能量场、实时…...

Krita Vision Tools:3分钟掌握AI智能选区,彻底告别手动抠图

Krita Vision Tools&#xff1a;3分钟掌握AI智能选区&#xff0c;彻底告别手动抠图 【免费下载链接】krita-vision-tools Krita plugin which adds selection tools to mask objects with a single click, or by drawing a bounding box. 项目地址: https://gitcode.com/gh_m…...

基于51单片机的智能交通灯控制系统:从仿真原理图到模块化设计实战

1. 智能交通灯控制系统概述 十字路口的交通灯控制是城市交通管理的基础设施&#xff0c;传统固定时长的红绿灯已经无法满足现代交通需求。基于51单片机的智能交通灯控制系统&#xff0c;通过可编程控制实现了灵活的时间调度和多种工作模式。这个系统不仅包含了基本的红绿灯切换…...

Git核心概念与版本控制思想启蒙

Git核心概念与版本控制思想启蒙 那天下午,调试器停在一个诡异的堆栈溢出位置。我盯着屏幕上的十六进制地址,突然意识到——三小时前能正常运行的代码,现在彻底崩了。更糟糕的是,我完全想不起自己改过哪些文件。Ctrl+Z按到手酸,文件恢复对话框弹了又弹,最后只能对着编译错…...

基于机器学习的智能预热算法

传统的缓存预热依赖静态规则(如LRU、LFU)或人工配置,无法适应动态变化的访问模式。机器学习(ML)通过学习历史访问模式、预测未来热点,实现缓存的自适应预热。本文从算法框架、模型选型、工程落地到生产实践,进行系统性剖析。 一、智能预热的总体框架 ML驱动的智能预热系…...

BMS开发避坑指南:从电压采样RC滤波到菊花链通信,那些硬件设计中的细节与“坑点”

BMS硬件设计实战&#xff1a;从电压采样到通信隔离的工程避坑指南 在电动汽车与储能系统蓬勃发展的今天&#xff0c;电池管理系统&#xff08;BMS&#xff09;作为核心安全部件&#xff0c;其硬件设计的可靠性直接关系到整个系统的性能与安全。本文将聚焦BMS开发中最容易忽视的…...