Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
从嵌套的分类数据中提取指定ID的子节点并扁平化:JavaScript教程_创想鸟

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

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

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

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

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

数据结构

首先,我们假设有如下的数据结构,表示分类信息:

interface Category {  name: string;  id: string;  count: string;  depth: string;  children: Category[];}const data: Category[] = [  {    name: "Car",    id: "19",    count: "20",    depth: "1",    children: [      {        name: "Wheel",        id: "22",        count: "3",        depth: "2",        children: [          {            name: "Engine",            id: "101",            count: "1",            depth: "3",            children: [              {                name: "Engine and Brakes",                id: "344",                count: "1",                depth: "4",                children: []              }            ]          }        ]      }    ]  },  {    name: "Bike",    id: "3",    count: "12",    depth: "1",    children: [      {        name: "SpeedBike",        id: "4",        count: "12",        depth: "2",        children: []      }    ]  }];

实现方法

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

立即学习“Java免费学习笔记(深入)”;

interface Category {  name: string;  id: string;  count: string;  depth: string;  children: Category[];}const mapCategory = (category: Category) => ({  name: category.name,  id: category.id,  count: category.count,});const getCategoriesChildren = (  categoryIds: Category['id'][],  categories: Category[],) => {  const foundChildren: Pick[] = [];  if (categoryIds.length === 0) {    return categories.reduce<Pick[]>(      (acc, category) => {        acc.push(mapCategory(category), ...category.children.map(mapCategory));        return acc;      },      [],    );  }  const stack: (Category & { 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) => ({ ...child, isDesired: true }))        : category.children),    );  }  return foundChildren;};

代码解释:

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

使用示例

const categoryIds1 = ['22', '3'];const result1 = getCategoriesChildren(categoryIds1, data);console.log(result1);// Expected Output:// [//   { name: "Engine", id: "101", count: "1" },//   { name: "Engine and Brakes", id: "344", count: "1" },//   { name: "SpeedBike", id: "4", count: "12" }// ]const categoryIds2: string[] = [];const result2 = getCategoriesChildren(categoryIds2, data);console.log(result2);// Expected Output:// [//  { name: "Car", id: "19", count: "20" },//  { name: "Wheel", id: "22", count: "3" },//  { name: "Bike", id: "3", count: "12" },//  { name: "SpeedBike", id: "4", count: "12" }// ]const categoryIds3 = ['4'];const result3 = getCategoriesChildren(categoryIds3, data);console.log(result3);// Expected Output:// []

注意事项

该方法使用了栈数据结构来避免递归调用,从而提高了性能。isDesired 属性用于标记目标分类的后代节点,避免重复遍历。如果需要处理非常大的数据集,可以考虑使用Web Workers来将计算任务放在后台线程中执行,以避免阻塞主线程。

总结

本教程介绍了一种使用JavaScript从深度嵌套的分类数据中提取特定ID的子节点,并将结果扁平化为一个数组的有效方法。该方法避免了传统的循环结构,而是采用栈数据结构,提供了一种更简洁和可读性更高的解决方案。 通过理解和应用本教程中的代码,你可以更有效地处理具有层级结构的分类数据,并提取所需的信息。

以上就是从嵌套的分类数据中提取指定ID的子节点并扁平化:JavaScript教程的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1517407.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
从嵌套分类数据中提取并展平指定子节点教程
上一篇 2025年12月20日 10:44:39
如何在循环渲染的组件中将特定项ID传递给表单提交的Payload
下一篇 2025年12月20日 10:44:55

相关推荐

  • MySQL字段注释快速补全方法_Sublime脚本自动生成标准文档结构

    MySQL字段注释快速补全方法_Sublime脚本自动生成标准文档结构MySQL字段注释快速补全方法_Sublime脚本自动生成标准文档结构MySQL字段注释快速补全方法_Sublime脚本自动生成标准文档结构MySQL字段注释快速补全方法_Sublime脚本自动生成标准文档结构

    要快速补全mysql字段注释,可通过sublime text编写python脚本实现自动化;1. 脚本获取表名,可手动输入或从当前sql文件解析;2. 通过subprocess调用mysql命令行获取show full columns信息;3. 解析输出内容,提取字段名和现有注释;4. 生成alte…

    2026年9月21日 • 用户投稿
    100
  • 更偏向移动端?Steam新版商店页引国外玩家批评

    今日,v社正式上线全新版本的steam商店界面,标志着此前长期测试的新设计终于全面启用。新版首页在视觉上更加开阔、简洁,将原先位于左侧的游戏分类菜单与顶部的蓝色导航栏整合为统一的顶部导航条,支持用户直接浏览竞速、潜行等具体游戏类型,并结合用户偏好实现个性化内容推荐。整体布局更贴近移动端操作逻辑,页面…

    2026年9月21日
    000
  • Hibernate Search嵌入式对象索引策略与常见问题解决

    本文探讨了在使用Hibernate Search对关联或嵌入式对象进行索引时遇到的常见问题,特别是@IndexedEmbedded与includePaths属性的结合使用。通过分析HSEARCH000216错误,揭示了嵌入式对象属性需要显式@Field注解才能被主实体索引的机制,并提供了具体的代码示…

    2026年9月21日
    100
  • 如何设置Linux软件包更新排除 yum exclude和apt-mark hold

    如何设置Linux软件包更新排除 yum exclude和apt-mark hold如何设置Linux软件包更新排除 yum exclude和apt-mark hold如何设置Linux软件包更新排除 yum exclude和apt-mark hold如何设置Linux软件包更新排除 yum exclude和apt-mark hold

    要阻止linux系统中特定软件包更新,可针对不同发行版使用相应方法。对于rhel/centos系系统,可通过在/etc/yum.conf或.repo文件中添加exclude=包名来排除升级;对于debian/ubuntu系系统,则使用sudo apt-mark hold 包名命令锁定版本。这两种方式…

    2026年9月21日 • 用户投稿
    500
  • MySQL热点数据缓存策略_MySQL减少磁盘访问提升性能

    MySQL热点数据缓存策略_MySQL减少磁盘访问提升性能MySQL热点数据缓存策略_MySQL减少磁盘访问提升性能MySQL热点数据缓存策略_MySQL减少磁盘访问提升性能MySQL热点数据缓存策略_MySQL减少磁盘访问提升性能

    mysql热点数据缓存的核心在于将频繁访问的数据保留在内存中以减少磁盘i/o,提升查询速度并缓解数据库压力。1. innodb缓冲池是关键机制,需合理配置其大小(通常为服务器内存的70-80%)及实例数以优化性能;2. 应用层缓存如redis/memcached通过前置缓存逻辑减少对mysql的直接…

    2026年9月21日 • 用户投稿
    000
  • 《如龙 极3》与峰义孝为主角《如龙3外传》等新情报发表

    《如龙 极3》与峰义孝为主角《如龙3外传》等新情报发表《如龙 极3》与峰义孝为主角《如龙3外传》等新情报发表《如龙 极3》与峰义孝为主角《如龙3外传》等新情报发表《如龙 极3》与峰义孝为主角《如龙3外传》等新情报发表

    世嘉公开《如龙极3/如龙3外传  dark ties》官方中文版预告宣传片,将于2026年2月12日发售 ​​​​,登陆ps5/ps4/switch2/xbox/pc平台,全球同步推出。 ​​​ 在2009年于PS3平台发售的《如龙3》焕然重生,为您打造“极致体验”。鲜活真实的冲绳街景、震撼力升级的…

    2026年9月21日 • 用户投稿
    100
  • 构建Spring自定义Kafka配置的注解式解决方案

    本文探讨了在Spring Boot应用中通过自定义注解实现Kafka配置自动化时遇到的挑战,特别是由于Bean注册时机不当导致的依赖注入失败。我们将深入分析问题根源,并提供两种核心解决方案:利用META-INF/spring.factories实现标准化的自动配置发现,以及通过ImportBeanD…

    2026年9月21日
    1100
  • SpringBoot的定时任务

    SpringBoot的定时任务SpringBoot的定时任务SpringBoot的定时任务SpringBoot的定时任务

    大家好,我是你们的老朋友全栈君。我们又见面了。 一、基于注解(@Scheduled)的定时任务 使用SpringBoot的@Scheduled注解来创建定时任务非常简单,只需几行代码就能实现。然而,@Scheduled默认是单线程运行,这意味着当启动多个任务时,一个任务的执行时间可能会影响到下一个任…

    2026年9月21日 • 用户投稿
    400
  • HuggingFace的AI混合工具如何使用?开发AI模型的实用操作教程

    HuggingFace的AI混合工具核心在于其生态系统设计,通过Transformers库的统一接口、Pipelines的抽象封装、Datasets与Accelerate等工具,实现多模型组合与微调。它允许开发者将复杂任务拆解,利用预训练模型如BERT、T5等,通过Python逻辑串联不同Pipel…

    2026年9月21日
    1100
  • MySQL如何处理长时间运行的查询_避免数据库阻塞?

    MySQL如何处理长时间运行的查询_避免数据库阻塞?MySQL如何处理长时间运行的查询_避免数据库阻塞?MySQL如何处理长时间运行的查询_避免数据库阻塞?MySQL如何处理长时间运行的查询_避免数据库阻塞?

    诊断mysql慢查询需1.开启慢查询日志并设置long_query_time;2.使用explain分析sql执行情况;3.借助工具如pt-query-digest分析日志。优化涉及1.确保join字段有索引;2.优化join顺序及减少join表数;3.使用临时表、批量处理和数据分区。防止阻塞应1.…

    2026年9月21日 • 用户投稿
    000
  • laravel如何进行安全的SQL查询以防止注入_Laravel安全SQL查询防注入方法

    使用Eloquent和Query Builder并配合参数绑定可有效防止SQL注入。Laravel通过PDO预处理机制自动转义参数,确保安全;应避免拼接用户输入,尤其在whereRaw等原生语句中需使用?占位符绑定变量;所有用户输入均需验证,对ID类字段强制类型转换,并禁止将用户输入直接用于表名、字…

    2026年9月21日
    000
  • PHP/MySQL:高效合并订单商品并按日期分组显示

    本教程将指导如何在PHP/MySQL应用中,将同一日期的订单商品合并显示在同一行,以提高数据展示的清晰度。核心解决方案是利用MySQL的GROUP_CONCAT函数在数据库层面进行高效聚合,避免复杂的PHP逻辑处理,从而简化代码并优化性能。 订单数据展示的常见挑战 在开发在线购物平台时,通常需要向用…

    2026年9月21日
    100
  • MySQL数据库如何支持多租户业务_设计策略与实现?

    MySQL数据库如何支持多租户业务_设计策略与实现?MySQL数据库如何支持多租户业务_设计策略与实现?MySQL数据库如何支持多租户业务_设计策略与实现?MySQL数据库如何支持多租户业务_设计策略与实现?

    mysql 支持多租户架构的关键在于选择合适的数据隔离策略,并兼顾性能与运维管理。1. 常见方式包括共享数据库共享表(资源利用率高但隔离性差)、共享数据库独立表(平衡隔离性与维护成本)和独立数据库(隔离性强但管理复杂)。2. 租户识别需在请求前确定租户id,并自动附加到sql查询中,可通过视图或中间…

    2026年9月21日 • 用户投稿
    000
  • MySQL重复数据检测与清理逻辑_Sublime脚本批量处理历史冗余记录

    MySQL重复数据检测与清理逻辑_Sublime脚本批量处理历史冗余记录MySQL重复数据检测与清理逻辑_Sublime脚本批量处理历史冗余记录MySQL重复数据检测与清理逻辑_Sublime脚本批量处理历史冗余记录MySQL重复数据检测与清理逻辑_Sublime脚本批量处理历史冗余记录

    处理mysql重复数据的核心步骤是识别并清理,可使用group by或窗口函数定位重复项,再通过分批删除或倒腾法安全清理;sublime text可用于高效生成和编辑sql语句。1. 识别重复数据常用group by+having或row_number()窗口函数;2. 清理策略包括分批删除、使用临…

    2026年9月21日 • 用户投稿
    100
  • windows10如何查看S.M.A.R.T.硬盘状态_windows10硬盘S.M.A.R.T.状态查看方法

    电脑运行慢、蓝屏或文件损坏可能是硬盘故障前兆,可通过S.M.A.R.T.技术检测健康状况。1、使用WMIC命令行工具输入“wmic diskdrive get model,status”查看状态,显示Pred Fail需立即备份数据;2、CrystalDiskInfo可深度分析S.M.A.R.T.参…

    2026年9月21日
    200
  • 分布式锁(Redis)解决数据竞争

    使用redis实现分布式锁来解决数据竞争可以通过setnx和expire命令。1)使用setnx尝试获取锁,并通过expire设置锁的过期时间防止死锁。2)释放锁时使用watch命令确保锁未被其他客户端获取。需要注意redis的单点故障、高并发性能瓶颈和锁的过期时间设置。 在处理高并发的应用场景中,…

    2026年9月21日
    000
  • 如何在Weka中处理向量属性:ARFF格式的限制与解决方案

    本文探讨了weka中arff格式对直接向量属性表示的限制,并提供了两种主要解决方案。对于时间序列数据,建议利用weka的内置时间序列分析功能。对于非时间序列数据,核心在于通过特征工程(如使用addexpression、multifilter等)将向量拆解并转换为可被weka有效处理的独立特征,以揭示…

    2026年9月21日
    000
  • PostgreSQL地理位置数据按距离排序的最佳实践:数据库层优化策略

    在处理大量地理位置数据并按距离排序时,将排序逻辑下推至数据库层(如postgresql)是更优的选择。这种方法能有效减少应用层的数据传输和内存消耗,充分利用数据库的计算能力,从而提升整体性能和资源利用率,而非在spring boot应用服务层进行排序。 1. 地理位置排序的需求与挑战 在现代Web应…

    2026年9月21日
    200
  • REDMI K90标准版外观预热:两款低饱和配色

    今日,redmi k90标准版正式开启预热,并首次公开完整外观设计。 官方称其为REDMI K系列历史上最为精致的标准版机型。从目前已公布的信息来看,新机将推出两种低饱和度配色:通透紫与纯净白,机身采用一体化包裹式金属中框,搭配同色系对称天线带设计,正面配备一块6.59英寸显示屏,凭借高达94%的屏…

    2026年9月21日
    100
  • Image Thresholding

    大家好,又见面了,我是你们的朋友全栈君。 Simple Thresholding The function cv.threshold is used to apply the thresholding. The first argument is the source image, which sh…

    2026年9月21日
    000

发表回复

登录后才能评论
关注微信