JavaScript 中获取嵌套数组的子元素

javascript 中获取嵌套数组的子元素

本文介绍了在 JavaScript 中处理深度嵌套数组,并根据指定的 ID 列表提取子元素的方法。通过迭代方式,避免了递归可能导致的栈溢出问题,并提供了清晰的代码示例和使用说明,帮助开发者高效地处理复杂的数据结构。无论是否提供 ID 列表,都能返回期望的子元素数组。

简介

在 JavaScript 开发中,经常会遇到需要处理嵌套较深的数组结构的情况。例如,树形结构的组织数据,每个节点可能包含子节点,而子节点又可能包含更深层次的子节点。本文将介绍一种高效的方法,用于从这种嵌套数组中,根据给定的 ID 列表,提取特定节点的直接子节点。

算法思路

核心思路是采用迭代的方式遍历嵌套数组,避免使用递归,从而避免了潜在的栈溢出风险,尤其是在处理深度非常大的嵌套结构时。

判断是否提供了 ID 列表:

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

如果提供了 ID 列表,则进入特定的子节点提取逻辑。如果没有提供 ID 列表,则返回所有顶层节点及其直接子节点。

提取特定子节点(当提供了 ID 列表时):

使用栈(Stack)来辅助迭代。将顶层节点放入栈中。循环遍历栈,直到栈为空。每次从栈中弹出一个节点,检查其 ID 是否在给定的 ID 列表中。如果节点的 ID 在 ID 列表中,则提取该节点的直接子节点,并将这些子节点添加到结果数组中。将当前节点的所有子节点压入栈中,以便后续处理。

提取顶层节点及其子节点(当没有提供 ID 列表时):

遍历顶层节点。将每个顶层节点及其直接子节点添加到结果数组中。

代码实现

type Category = {  name: string;  id: string;  count: string;  depth: string;  children: Category[];};const getCategoriesChildren = (  categoryIds: Category['id'][],  categories: Category[],): Pick[] => {  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 = [...categories];  while (stack.length) {    const category = stack.pop();    if (!category) continue;    if (categoryIds.includes(category.id)) {      foundChildren.push(        ...category.children.map((childCategory) => ({          name: childCategory.name,          id: childCategory.id,          count: childCategory.count,        })),      );    }    stack.push(...category.children);  }  return foundChildren;};const mapCategory = (category: Category): Pick => ({  name: category.name,  id: category.id,  count: category.count,});

代码解释:

Category 类型定义了节点的结构,包括 name、id、count、depth 和 children 属性。getCategoriesChildren 函数接收两个参数:categoryIds(ID 列表)和 categories(顶层节点数组)。如果没有提供 categoryIds,则使用 reduce 方法遍历 categories 数组,将每个节点及其子节点映射为包含 name、id 和 count 属性的对象,并将它们添加到结果数组中。如果提供了 categoryIds,则使用栈 stack 来迭代遍历嵌套数组。在 while 循环中,从栈中弹出一个节点,检查其 ID 是否在 categoryIds 列表中。如果在列表中,则提取该节点的子节点,并将它们添加到 foundChildren 数组中。无论节点的 ID 是否在列表中,都将其子节点压入栈中,以便后续处理。

使用示例

const data = [  {    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 为 '101' 和 '3' 的节点的子节点const children1 = getCategoriesChildren(['101', '3'], data);console.log(children1);// Expected Output:// [//   { name: 'Engine and Brakes', id: '344', count: '1' },//   { name: 'SpeedBike', id: '4', count: '12' }// ]// 获取所有顶层节点及其子节点const children2 = getCategoriesChildren([], data);console.log(children2);// 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' }// ]

注意事项

该方法使用迭代方式,避免了递归可能导致的栈溢出问题,适用于处理深度较大的嵌套数组。代码使用了 TypeScript,可以提供更好的类型检查和代码提示。如果使用 JavaScript,可以移除类型定义。可以根据实际需求修改代码,例如,提取节点的其他属性,或者修改提取子节点的条件。

总结

本文介绍了一种高效的方法,用于从 JavaScript 的深度嵌套数组中,根据给定的 ID 列表,提取特定节点的直接子节点。该方法使用迭代方式,避免了递归可能导致的栈溢出问题,并提供了清晰的代码示例和使用说明。通过学习本文,可以更好地处理复杂的数据结构,提高开发效率。

以上就是JavaScript 中获取嵌套数组的子元素的详细内容,更多请关注创想鸟其它相关文章!

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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
DeepSeek支持团队协作吗 DeepSeek多人协作功能说明
上一篇 2025年11月23日 04:35:03
Steam新一周销量榜:《明末:渊虚之羽》排名大降 竟成守门员!
下一篇 2025年11月23日 04:37:06

相关推荐

  • Laravel API中的错误处理和返回格式规范

    在 laravel 中实现错误处理和规范 api 返回格式的步骤包括:1) 使用 laravel 内置的异常处理机制捕获和处理异常;2) 定义统一的返回格式结构,包含 success、data 和 message 字段;3) 在关键业务逻辑中使用 try-catch 块处理特定异常;4) 利用 ap…

    2026年8月27日
    000
  • 如何优雅地管理PHP异步操作:使用Composer引入GuzzleHttp/Promises

    Composer在线学习地址:学习地址 告别“回调地狱”:PHP异步操作的痛点 你是否曾遇到这样的场景:你的php应用需要从多个外部服务获取数据,或者执行一些耗时的后台任务。如果这些操作都是同步进行的,那么用户就得眼睁睁地看着页面转圈,直到所有操作完成。这不仅严重影响了用户体验,也浪费了服务器资源。…

    用户投稿 2026年8月27日
    000
  • 使用Yii作为微服务架构的后端

    使用yii框架可以有效地构建微服务架构的后端。1) yii的restful api支持强大,适合定义和管理api端点。2) 依赖注入容器便于管理服务间依赖。3) 模块化设计有助于功能拆分和重组。4) 性能优化和最佳实践,如缓存和日志系统,提升服务性能和可靠性。 你想知道如何使用Yii框架来构建微服务…

    2026年8月27日
    000
  • Laravel中的多因素认证(MFA)如何实现?

    在laravel中实现多因素认证(mfa)可以通过结合现有认证系统和第三方库(如google authenticator)来完成。具体步骤包括:1.生成并保存密钥到用户数据库;2.生成qr码让用户扫描;3.用户输入一次性密码进行验证。实现mfa需要在安全性和用户体验之间找到平衡,并考虑备份恢复、安全…

    2026年8月27日
    000
  • 录音笔传输文件自动校验

    录音笔传输文件自动校验录音笔传输文件自动校验录音笔传输文件自动校验录音笔传输文件自动校验

    一、引言 校验文件完整性的重要性:在日常工作和生活中,我们常常需要从网络上获取各种数据,但这些下载的文件是否安全值得商榷;即使是安全的,如果下载不完整,也会导致文件不可用;更糟糕的是,文件可能被篡改,加入了木马、病毒或广告等。因此,下载数据时校验其完整性是非常必要的。 在小编(●—●)参与的项目中,…

    2026年8月27日 用户投稿
    000
  • java中文乱码问题 乱码产生原因和修复方案

    java 中文乱码问题主要由字符编码不一致导致,修复方法包括确保系统编码一致性和正确处理编码转换。1. 统一使用 utf-8 编码,从文件到数据库和程序。2. 读取文件时明确指定编码,如使用 bufferedreader 和 inputstreamreader。3. 设置数据库字符集,如 mysql…

    2026年8月26日
    000
  • 使用JAXB解析带命名空间的XML请求到Java对象

    本文旨在帮助开发者解决在使用JAXB(Java Architecture for XML Binding)将包含命名空间的XML请求解析为Java对象时遇到的`UnmarshalException`异常。通过修改`@XmlRootElement`注解,明确指定命名空间,可以有效解决由于命名空间不匹配…

    2026年8月26日
    000
  • 酷狗音乐官网版入口-酷狗音乐音乐人平台官网登录入口​

    酷狗音乐官网入口为www.kugou.com,进入后可登录使用网页版听歌,支持搜索、播放、建歌单等功能;音乐人可通过官网开放平台入驻,完成资料提交后上传作品并获取收益。 酷狗音乐官网版入口在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来酷狗音乐官网版入口以及酷狗音乐人平台官网登录入口相关信…

    2026年8月26日
    000
  • java中list的用法 list集合的常用操作方法汇总

    java中的list集合支持多种操作:1.添加元素:使用add方法,默认在末尾添加,也可指定位置。2.删除元素:使用remove方法,需注意删除不存在的元素会抛出异常。3.查找元素:indexof和contains方法,时间复杂度为o(n)。4.排序:使用collections.sort方法,arr…

    2026年8月26日
    000
  • 儿童节礼物-BlueKeep漏洞POC恐怖来袭

    儿童节礼物-BlueKeep漏洞POC恐怖来袭儿童节礼物-BlueKeep漏洞POC恐怖来袭儿童节礼物-BlueKeep漏洞POC恐怖来袭儿童节礼物-BlueKeep漏洞POC恐怖来袭

    0x00:简介 (BlueKeep漏洞的编号为CVE-2019-0708) 据外媒SecurityWeek报道,近百万设备存在BlueKeep高危漏洞的安全风险,并且已有黑客开始扫描寻找潜在的攻击目标。 此漏洞被描述为可蠕虫式传播(wormable),通过RDS服务传播恶意程序,类似于2017年横行…

    2026年8月26日 用户投稿
    000
  • 定时器(Timer)的底层实现

    定时器的底层实现依赖于操作系统的硬件计时器和软件调度机制:1. 硬件层面通过pit或apic等计时器触发中断,管理时间片和任务调度;2. 软件层面通过操作系统api(如linux的timer_create和timer_settime)与内核交互,实现定时器功能。 定时器(Timer)的底层实现到底是…

    2026年8月26日
    000
  • Bing浏览器国际版大陆能用吗_Bing国际版在国内的访问与使用情况

    Bing国际版可通过https://www.bing.com访问,中国大陆用户可能被重定向至cn.bing.com,建议清除缓存或使用无痕模式并手动切换语言和地区;部分功能受限且搜索结果可能本地化,需稳定网络环境或代理工具以获得完整体验;登录Microsoft账户可同步设置,但无法访问中国大陆屏蔽的…

    2026年8月26日
    100
  • Java中组合优于继承的设计理念

    组合优于继承是Java设计原则,主张通过对象组合实现代码复用,而非继承。它降低耦合、提升灵活性与可维护性。继承导致紧耦合、破坏封装、单继承限制等问题,而组合通过接口依赖、运行时行为切换、多行为集成等优势弥补这些缺陷。实践中应定义行为接口,在类中持有接口引用并注入具体实现。该原则提倡慎用继承,仅在明确…

    2026年8月26日
    000
  • 微信公众号怎么设置_微信公众号基础设置与菜单配置教程

    答案:微信公众号设置需完善头像、名称、功能介绍等基础信息,并合理配置自定义菜单。首先完成认证后,应立即设置清晰有辨识度的头像,命名易记且体现定位的账号名称,撰写直击用户痛点的功能介绍,并配置包含感谢语和引导内容的欢迎语;接着在自定义菜单中规划最多三个一级菜单,每个下设不超过五个二级菜单,将核心功能如…

    2026年8月26日
    100
  • 苹果怎么设浏览器默认_iPhone设置默认浏览器应用教程

    从iOS 14起可设第三方浏览器为默认。先确认Chrome、Edge等已支持并更新,再进入设置→浏览器→默认浏览器应用→选择对应浏览器,最后点击链接验证是否生效。 从iOS 14开始,苹果允许用户将第三方浏览器设为默认应用。虽然系统自带Safari仍是初始默认,但你可以轻松更换成Chrome、Edg…

    2026年8月26日
    100
  • 依赖注入(DI)容器设计

    依赖注入容器是一种管理和注入对象依赖的工具,提升代码可维护性和灵活性。设计高效di容器需考虑:1. 生命周期管理(单例、瞬时、范围);2. 依赖解析(处理复杂关系图);3. 配置灵活性(支持多种配置方式);4. 性能优化(缓存、延迟加载、并行解析)。 依赖注入(DI)容器是现代软件开发中一个关键的设…

    2026年8月26日
    000
  • 如何实现API接口的幂等性?

    实现api接口的幂等性可以通过以下方法:1. 使用唯一标识,如请求id,确保重复请求返回相同结果;2. 状态控制,通过检查订单状态避免重复操作;3. 乐观锁,利用版本号在并发场景下保证幂等性;4. 版本控制,确保请求版本匹配后才处理请求。这些方法各有优劣,需结合具体业务场景选择和优化。 实现API接…

    2026年8月26日
    000
  • 如何利用Java使用ConcurrentHashMap处理并发

    ConcurrentHashMap因分段锁和CAS机制提升并发性能,支持原子操作如putIfAbsent、compute、merge,遍历时提供弱一致性视图,适用于高并发场景。 在多线程环境中,ConcurrentHashMap 是 Java 提供的一个高效且线程安全的 Map 实现。它比传统的 H…

    2026年8月26日
    000
  • 如何在PHP应用中优雅地解决并发问题?使用eonx-com/easy-lock实现分布式锁

    可以通过一下地址学习composer:学习地址 当并发成为你的“心头大患” 想象一下这样的场景:你有一个电商平台,当用户下单时需要更新库存。如果同一件商品在短时间内被多个用户同时购买,而你的系统没有适当的并发控制,就可能出现库存超卖、数据不一致等严重问题。又或者,你有一个定时任务(cron job)…

    用户投稿 2026年8月26日
    000
  • DevOps核心原则-稳定的工作流程

    DevOps核心原则-稳定的工作流程DevOps核心原则-稳定的工作流程DevOps核心原则-稳定的工作流程DevOps核心原则-稳定的工作流程

    如果您询问三个人对devops的定义,您可能会得到四种不同的回答。有时,参与运营的开发人员被称为devops。其他人认为它与基础设施和部署的自动化有关。还有一些人认为devops是系统管理员的现代化标签。显然,这个术语非常流行。那么,devops到底是什么呢? DevOps的第一种方式是通过组织中各…

    2026年8月26日 用户投稿
    100

发表回复

登录后才能评论
关注微信