首页电脑使用从嵌套的分类数据中提取指定ID的子节点并扁平化:JavaScript教程

从嵌套的分类数据中提取指定ID的子节点并扁平化:JavaScript教程

圆圆2025-08-23 20:01:29次浏览条评论

从嵌套的分类数据中提取指定id的子节点并扁平化:javascript教程从嵌套的分类数据中提取指定ID的子节点并仲裁:JavaScript教程

本文档详细介绍了如何使用JavaScript从深度嵌套的分类数据中提取特定ID的子节点,并将结果嵌套为一个数组。我们提供了一个高效的算法,避免了传统的循环结构,而是采用栈数据结构和条件判断,以实现目标。同时,我们还讨论了在返回没有指定ID时父节点直接和子节点,以及在指定ID没有子节点时返回空数组的策略。

在处理具有系统结构的分类数据时,需要经常根据特定的分类ID取出所有子节点解​​决方案,将这些节点分区到一个更高的堆栈中。本教程将介绍一种使用JavaScript实现此功能的有效方法,该方法避免了使用for、forEach和while等传统循环结构,而是采用栈数据结构,提供了其更简洁和可删除性的方案。

数据结构

首先,我们假设有如下的数据结构,表示分类信息:interface Category { name: string; id: string; count: string; depth: string; kids: Category[];}const data: Category[] = [ { name: quot;Carquot;, id: quot;19quot;, count: quot;20quot;, depth: quot;1quot;, Children: [ { name: quot;Wheelquot;, Children: [ { name: quot;Wheelquot;, id: quot;22quot;,计数: quot;3quot;,深度: quot;2quot;,子项: [ { name: quot;发动机quot;, id: quot;101quot;,计数: quot;1quot;,深度: quot;3quot;,子项: [ { name: quot;发动机和制动器quot;,id: quot;344quot;,计数: quot;1quot;,深度: quot;4quot;,孩子们:[] } ] } ] } ] }, { name: quot;Bikequot;, id: quot;3quot;, 计数: quot;12quot;, 深度: quot;1quot;, 子项: [ { name: quot;SpeedBikequot;, id: quot;4quot;, 计数: quot;12quot;, 深度: quot;2quot;, 子项: [] } ] }];登录后复制实现方法

以下是实现提取指定ID子节点并梳理化的函数:

立即学习“Java免费笔记学习(深入)”;interface Category { name:string;id:string;count:string;深度:string;children:Category[];}const mapCategory = (category:Category) =gt;({ name:category.name,id:category.id,count:类别.count,});const getCategori

esChildren = ( categoryIds: Category['id'][], categories: Category[],) =gt; { const foundChildren: Picklt;类别, 'id' | 'count' | 'name'gt;[] = []; if (categoryIds.length === 0) { return categories.reducelt;Picklt;类别, 'id' | 'count' | 'name' 'name'gt;[]gt;( (acc, category) =gt; { acc.push(mapCategory(category), ...category.children.map(mapCategory)); return acc; }, [], ); } const stack: (Category amp; { isDesired?: boolean })[] = [...categories]; while (stack.length) { const category = stack.pop(); if (!category) continue; const isDesiredCategory = categoryIds.includes(category.id) || category.isDesired; if (isDesiredCategory) {foundChildren.push(...category.children.map(mapCategory)); } stack.push( ...(isDesiredCategory ?category.children.map((child) =gt; ({ ...child, isDesired: true })) :category.children), ); } return findChildren;};登录后复制

代码解释:mapCategory函数:用于提取每个分类的name、id和count属性,创建一个新的对象。getCategoriesChildren函数:接收两个参数:categoryIds(要取出子节点​​的分类ID数组)和categories(分类数据数组)。如果categoryIds为空,则返回所有父节点和直接子节点。使用reduce方法取出类别数据库,将每个分类及其直接子节点映射到新的对象并添加到结果数据库中。如果categoryIds 不为空,则使用栈数据结构来遍历分类树。创建一个栈栈,把类别数组中的所有分类添加到栈中。使用while循环,只要栈不为空,就从栈中弹出一个分类。检查当前分类的id是否在categoryIds栈中,或者该分类是否是目标分类的后代节点(通过isDesired属性判断)。

如果是目标分类的子节点,则将其子节点映射到新的对象并添加到foundChildren 缓存中。将当前分类的子节点添加到栈中,如果当前分类是目标分类,则将其子节点的isDesired 属性设置为true,表示这些子节点是目标分类的子节点。最后,返回foundChildren 备份。使用实例const CategoryIds1 = ['22', '3'];const result1 = getCategoriesChildren(categoryIds1, data);console.log(result1);// 预期输出:// [// { name: quot;Enginequot;, id: quot;101quot;, count: quot;1quot; },// { name: quot;Engine and Brakesquot;, id: quot;344quot;, count: quot;1quot; },// { name: ”SpeedBike”;, id: quot;4quot;, count: quot;12quot; }// ]const categoryIds2: string[] = [];const result2 = getCategoriesChildren(categoryIds2, data);console.log(result2);// 预期输出:// [// { name: quot;Carquot;, id: quot;19quot;, count: quot;20quot; },// { name: quot;Wheelquot;, id: quot;22quot;, count: quot;3quot; },// { name: quot;Bikequot;, id: quot;3quot;, count: quot;12quot; },// { name: quot;SpeedBikequot;, id: quot;4quot;, count: quot;12quot; }// ]const categoryIds3 = ['4'];const result3 = getCategoriesChildren(categoryIds3, data);console.log(result3);// 预期输出:// []登录后复制注意事项该方法使用了栈结构来避免递归调用,从而提高了性能。isDesired 属性用于标记目标分类的后代节点,避免重复处理。如果需要处理非常大的数据集,可以考虑使用Web工人来将计算任务放在后台线程中执行,蓝牙阻塞主线程。总结

本教程介绍了一种使用JavaScript从深度嵌套的分类数据中提取特定ID的子节点,处理结果包裹化为一个数组的有效方法。该方法避免了传统的循环结构,而是采用数据结构,提供了一种更简洁和吸引力更高的方案。通过理解和应用本教程中的代码,你可以更有效地处理结构化分类的数据,并排序整个的信息。

以上就是从编织的分类数据中指定提取ID的子宫颈并梳理:JavaScript教程的详细内容,更多请关注乐哥常识网其他相关文章!

从嵌套的分类数据中提
检测文件类型 文件检测器检测到文件结构不一致
相关内容
发表评论

游客 回复需填写必要信息