new Set 过滤数据实战
在表格过滤、多选筛选等场景中如何高效地处理层级数据本文通过一个真实的产品分组过滤案例详解Set数据结构在数据筛选中的妙用并给出健壮性、性能优化方案一、背景与需求在后台管理系统中我们经常遇到这样的表格过滤需求表格每一行数据关联一个group_id产品分组 ID。用户可以通过下拉筛选器选择若干个分组父级。过滤结果需要同时包含所选分组本身及其所有子分组子孙后代下的数据行。也就是说选择“电子产品”分组时不仅要显示group_id等于“电子产品”的行还要显示其子分组如“手机”、“电脑”下的所有行。实现这样一个过滤逻辑既要求代码清晰又要兼顾性能和健壮性。二、传统实现方式的问题初版代码可能这样写filterMethod: ({ option, row }) { const selectedIds option.data; // 假设是数组 if (!selectedIds || selectedIds.length 0) return true; // 遍历每个选中的分组检查当前行是否属于该分组或其子分组 return selectedIds.some(id { const group groupOptions.find(g g.id id); if (!group) return false; return group.id row.group_id || (group.children_id group.children_id.includes(row.group_id)); }); }这种写法虽然直观但存在几个痛点重复查找每次过滤都要遍历selectedIds对每个 ID 还要在groupOptions中查找时间复杂度高O(n*m)。层级局限只支持一层子分组若存在孙级分组则无法匹配。数据安全未对option.data做类型校验可能因数据格式异常导致报错。三、Set登场化繁为简JavaScript 的Set对象提供了 O(1) 的查找性能并且天然去重。我们可以利用Set存储所有需要保留的分组 ID包括选中分组及其后代然后只需判断当前行的group_id是否存在于该集合中一步到位。优化后的代码如下实际案例filterMethod: ({ option, row }) { // 1. 获取筛选数据并进行安全处理 const rawData option.data; if (!rawData || !Array.isArray(rawData) || rawData.length 0) { return true; // 无筛选条件显示全部 } // 2. 将选中的 ID 放入 Set以便快速查找 const selectedSet new Set(rawData); // 3. 获取全部分组数据外部响应式数据 const allGroups groupOptions.value || []; // 4. 递归收集所有需要保留的分组 ID包含后代 const keepIds new Set(); const collect (id) { if (keepIds.has(id)) return; // 防止重复递归 const group allGroups.find(g g.id id); if (!group) return; keepIds.add(group.id); if (Array.isArray(group.children_id)) { group.children_id.forEach(childId collect(childId)); } }; // 对每个选中的 ID 执行收集 rawData.forEach(id collect(id)); // 5. 判断当前行的 group_id 是否在 keepIds 中 return keepIds.has(row.group_id); }四、代码逐段解析1. 筛选数据安全获取const rawData option.data; if (!rawData || !Array.isArray(rawData) || rawData.length 0) return true;明确要求rawData为数组否则视为“未选择任何条件”显示所有行。避免因option.data为字符串或对象时调用new Set()引发异常。2. 使用Set存储选中 IDconst selectedSet new Set(rawData);虽然本例中并未直接使用selectedSet因为我们使用了rawData.forEach循环但若后续需要快速判断某个 ID 是否被选中Set比数组的includes更高效。实际我们直接遍历rawData即可但建立Set是一个好习惯。3. 递归收集后代 IDconst keepIds new Set(); const collect (id) { if (keepIds.has(id)) return; const group allGroups.find(g g.id id); if (!group) return; keepIds.add(group.id); if (Array.isArray(group.children_id)) { group.children_id.forEach(childId collect(childId)); } };核心逻辑从每个选中的分组 ID 出发递归遍历其children_id将所有子孙 ID 加入keepIds。利用Set自动去重避免重复添加且has()检查可提前终止递归防止循环引用。递归深度取决于分组层级若层级过深可考虑改为迭代栈但一般情况下足够。4. 最终匹配return keepIds.has(row.group_id);只需一次Set查找时间复杂度 O(1)比多层循环快得多。五、性能与健壮性优化建议5.1 预构建分组映射表每次过滤都执行allGroups.find查找若分组数量庞大成千上万可提前构建一个Map以id为键const groupMap new Map(); groupOptions.value.forEach(g groupMap.set(g.id, g)); // 在 collect 中改为 const group groupMap.get(id);5.2 缓存过滤结果如果表格数据不常变动可以在筛选条件变化时预先计算好keepIds然后对每一行直接判断减少重复计算。5.3 处理深层级与循环引用如果分组存在循环引用A 的 children 包含 BB 的 children 包含 A上述递归会无限执行。通过keepIds.has(id)检查可以打破循环因为第二次遇到相同 ID 时会直接返回。5.4 明确数据结构在实际业务中应确保groupOptions中的每个对象都有id和children_id字段children_id可以是空数组。使用 TypeScript 或 JSDoc 进行类型注解提升代码可维护性。六、总结Set是处理集合运算的利器去重、判存、交集差集都极为高效特别适合过滤、权限校验等场景。递归展开层级结构通过Set记忆已处理节点既能完整覆盖所有后代又能避免死循环。健壮性不可忽视对输入数据做类型和空值检查能大幅降低生产环境报错概率。性能优化分层对于高频操作预先建立索引Map/Set可显著提升响应速度。通过这个实战案例我们不仅学会了如何用Set优雅地解决复杂过滤问题还掌握了递归、缓存等通用优化手段。在你的下一个表格或树形筛选需求中不妨试试这套组合拳吧附录完整组件化示例Vue 3 Element Plus 风格script setup import { ref } from vue; const groupOptions ref([ { id: g1, name: 电子产品, children_id: [g2, g3] }, { id: g2, name: 手机, children_id: [g4] }, { id: g3, name: 电脑, children_id: [] }, { id: g4, name: 智能手机, children_id: [] }, ]); const tableData ref([ { group_id: g1, product: 电视 }, { group_id: g4, product: iPhone }, { group_id: g3, product: MacBook }, ]); const filterMethod ({ option, row }) { // ... 上述实现 }; /script希望这篇文章能帮助你更好地理解Set在实际开发中的应用并写出更高效、更健壮的过滤逻辑。如有疑问欢迎交流探讨

相关新闻

职场人如何提升猎头关注度:5层过滤机制与实战策略

职场人如何提升猎头关注度:5层过滤机制与实战策略

1. 为什么猎头不来找你?职场人必须知道的5个真相最近和几位资深猎头朋友吃饭,聊到一个有趣的现象:有些能力不错的候选人,工作五六年却从没接到过猎头电话;而有些资历平平的同行,反而经常被猎头"骚扰&q…

2026/8/1 7:28:53 阅读更多 →
AI视频的u201C最后一公里u201D:为什么画面越来越真,人物却越来越假?

AI视频的u201C最后一公里u201D:为什么画面越来越真,人物却越来越假?

AI视频的"最后一公里":为什么画面越来越真,人物却越来越假? 最近一周的AI新闻里,有两件事放在一起看很有意思。 第一件:Google发布了Veo 3.1 Lite,一款定位"低价走量"的视频生成模型&a…

2026/7/31 22:36:56 阅读更多 →
Scala编程:多范式语言的核心特性与工程实践

Scala编程:多范式语言的核心特性与工程实践

1. Scala语言概述:多范式编程的瑞士军刀 2004年诞生的Scala语言,以其独特的"可扩展语言"(Scalable Language)设计理念,在JVM生态中开辟了一条融合面向对象与函数式编程的新道路。作为一门静态类型语言&#…

2026/7/29 21:02:50 阅读更多 →

最新新闻

ZenlessZoneZero-OneDragon终极指南:如何用一条龙自动化彻底解放你的绝区零游戏体验

ZenlessZoneZero-OneDragon终极指南:如何用一条龙自动化彻底解放你的绝区零游戏体验

ZenlessZoneZero-OneDragon终极指南:如何用一条龙自动化彻底解放你的绝区零游戏体验 【免费下载链接】ZenlessZoneZero-OneDragon 绝区零 一条龙 | 全自动 | 自动闪避 | 自动每日 | 自动空洞 | 支持手柄 项目地址: https://gitcode.com/gh_mirrors/ze/ZenlessZone…

2026/8/1 12:30:25 阅读更多 →
电商干货:卡特加特AI智能体完整能力

电商干货:卡特加特AI智能体完整能力

电商干货的核心在于可落地、能见效。卡特加特AI电商智能体的能力体系,不是停留在概念层面的技术展示,而是已经过大量电商实际场景验证的生产力工具。对于想真正提升经营效率的电商从业者来说,了解这些能力的实操价值比了解技术原理重要得多。…

2026/8/1 12:30:25 阅读更多 →
音乐解锁终极指南:3分钟恢复你的数字音乐自由

音乐解锁终极指南:3分钟恢复你的数字音乐自由

音乐解锁终极指南:3分钟恢复你的数字音乐自由 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库: 1. https://github.com/unlock-music/unlock-music ;2. https://git.unlock-music.dev/um/web 项目地址: https://gitco…

2026/8/1 12:30:25 阅读更多 →
Zettelkasten完整教程:如何用卡片盒笔记法构建你的第二大脑

Zettelkasten完整教程:如何用卡片盒笔记法构建你的第二大脑

Zettelkasten完整教程:如何用卡片盒笔记法构建你的第二大脑 【免费下载链接】Zettelkasten Zettelkasten-Developer-Builds 项目地址: https://gitcode.com/gh_mirrors/ze/Zettelkasten 还在为笔记杂乱无章而烦恼吗?Zettelkasten是一款基于德国社…

2026/8/1 12:30:25 阅读更多 →
ESP32烧录失败硬件排查指南:从供电到信号时序的完整解决方案

ESP32烧录失败硬件排查指南:从供电到信号时序的完整解决方案

1. 项目概述:为什么ESP32烧录总出问题?硬件是第一步如果你玩ESP32有一段时间了,大概率遇到过这样的场景:代码编译通过了,点击上传按钮,进度条走一半就卡住,然后IDE弹出一堆看不懂的红色错误&…

2026/8/1 12:30:25 阅读更多 →
终极文件分析指南:Detect-It-Easy如何快速识别文件类型与安全风险

终极文件分析指南:Detect-It-Easy如何快速识别文件类型与安全风险

终极文件分析指南:Detect-It-Easy如何快速识别文件类型与安全风险 【免费下载链接】Detect-It-Easy Program for determining types of files for Windows, Linux and MacOS. 项目地址: https://gitcode.com/gh_mirrors/de/Detect-It-Easy Detect-It-Easy&am…

2026/8/1 12:29:25 阅读更多 →

日新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/1 0:00:48 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/1 0:00:48 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/1 0:00:48 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/31 1:03:03 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/8/1 5:19:34 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/8/1 10:33:33 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/1 0:00:48 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/1 0:00:48 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/1 0:00:48 阅读更多 →