从深度嵌套数组中高效提取特定类型对象


从深度嵌套数组中高效提取特定类型对象

本文详细介绍了如何使用迭代堆栈(stack)方法,从复杂的深度嵌套对象数组中提取所有具有特定type属性的对象。该教程通过清晰的算法步骤和typescript代码示例,演示了如何有效遍历多层数据结构,避免了递归可能导致的栈溢出问题,适用于处理层级不定的数据。

在现代Web应用开发中,我们经常需要处理复杂的数据结构,其中包含多层嵌套的对象和数组。例如,一个UI组件树、一个文档对象模型(DOM)的表示,或者像本例中所示的具有items子属性的“组”结构。当我们需要从这种深度嵌套的数据中筛选出所有满足特定条件的元素时,传统的数组方法(如filter)往往力不从心,因为它只能处理当前层级的元素。

本教程将提供一种健壮且高效的方法来解决这个问题:使用迭代式的深度优先遍历(DFS)结合堆栈(Stack)数据结构。这种方法能够确保遍历到所有层级的元素,并且避免了递归深度过大可能导致的栈溢出问题。

挑战:深度嵌套数据中的特定元素提取

假设我们有一个JSON数组,其中每个对象可能包含一个type属性,并且一些对象还可能包含一个items数组,而items数组中的元素又可能遵循相同的结构,形成一个深层嵌套的树状结构。我们的目标是从这个复杂的结构中找出所有type属性值为 "text" 的对象。

以下是一个示例数据结构:

Jaaz Jaaz

开源的AI设计智能体

Jaaz 216 查看详情 Jaaz
[
    {
        "index": 3,
        "uid": "188960ecb29_00562b0c",
        "type": "group",
        "items": [
            {
                "uid": "18895f59b1a_2c5a5c7a",
                "type": "text", // 这是一个目标对象
                "text": ["abc"]
            },
            {
                "index": 1,
                "type": "group",
                "items": [
                    {
                        "uid": "18895ecc7c7_2d5440b6",
                        "type": "text", // 另一个目标对象
                        "text": ["xyz"]
                    }
                ]
            }
        ]
    }
    // ... 更多类似的嵌套结构
]

解决方案:迭代式堆栈遍历算法

为了遍历所有层级的元素,我们可以采用类似深度优先搜索(DFS)的策略,但通过显式管理一个堆栈来避免函数调用栈的限制。

算法步骤

  1. 初始化结果数组: 创建一个空数组,用于存储所有符合条件的对象。
  2. 初始化堆栈: 创建一个堆栈,并将输入数组中的所有顶层元素压入堆栈。
  3. 循环遍历: 当堆栈不为空时,重复以下操作:
    • 弹出元素: 从堆栈顶部弹出一个当前元素。
    • 条件检查: 检查当前元素的 type 属性是否与目标类型(例如 "text")匹配。如果匹配,则将此元素添加到结果数组中。
    • 压入子元素: 如果当前元素包含一个 items 属性(表示它有子元素),则将 items 数组中的所有子元素压入堆栈。这样可以确保在下一轮循环中,这些子元素也会被处理。
  4. 返回结果: 循环结束后,返回包含所有符合条件对象的结果数组。

TypeScript 实现示例

下面是基于上述算法的 TypeScript 实现代码。为了方便演示,我们假设 data 是一个全局或传入的数组变量。

// 假设这是我们的输入数据结构
interface NestedItem {
  uid: string;
  type: string;
  items?: NestedItem[]; // 子元素可能也是NestedItem类型
  [key: string]: any; // 允许其他任意属性
}

const data: NestedItem[] = [
  {
    "index": 3,
    "uid": "188960ecb29_00562b0c",
    "x": 18.65,
    "y": 44.14,
    "width": 180.14,
    "height": 53.33,
    "items": [
      {
        "uid": "18895f59b1a_2c5a5c7a",
        "locked": false,
        "rotation": 0,
        "type": "text", // 目标对象
        "text": ["abc"],
        "x": 154.37,
        "y": 0,
        "width": 25.76,
        "height": 20.90
      },
      {
        "index": 1,
        "uid": "1889607cfdf_091e59ca",
        "x": 0,
        "y": 32.43,
        "width": 22.17,
        "height": 20.90,
        "items": [
          {
            "uid": "18895ecc7c7_2d5440b6",
            "locked": false,
            "rotation": 0,
            "type": "text", // 目标对象
            "text": ["xyz"],
            "x": 0,
            "y": 0,
            "width": 22.17,
            "height": 20.90
          }
        ],
        "type": "group",
        "rotation": 0
      },
      {
        "index": 2,
        "uid": "188960e945c_35ab99fa",
        "x": 44.10,
        "y": 15.56,
        "width": 56.72,
        "height": 35.17,
        "items": [
          {
            "uid": "18896072844_1298562b",
            "locked": false,
            "rotation": 0,
            "type": "text", // 目标对象
            "text": ["group"],
            "x": 15.56,
            "y": 14.27,
            "width": 41.15,
            "height": 20.90
          },
          {
            "index": 3,
            "uid": "188960e5f49_2341c362",
            "x": 0,
            "y": 0,
            "width": 29.80,
            "height": 20.90,
            "items": [
              {
                "uid": "188958badfe_3a73220b",
                "locked": false,
                "rotation": 0,
                "type": "text", // 目标对象
                "text": ["Text"],
                "x": 0,
                "y": 0,
                "width": 29.80,
                "height": 20.90
              }
            ],
            "type": "group",
            "rotation": 0
          }
        ],
        "type": "group",
        "rotation": 0
      }
    ],
    "type": "group",
    "rotation": 0
  }
];

/**
 * 从深度嵌套的数组中提取所有指定类型的对象。
 * @param targetType 要查找的对象类型字符串。
 * @param initialData 初始的嵌套数据数组。
 * @returns 包含所有匹配对象的数组。
 */
const getSpecificType = (targetType: string, initialData: NestedItem[]): NestedItem[] => {
  const result: NestedItem[] = []; // 存储结果的数组
  // 使用展开运算符将初始数据复制到堆栈中,避免修改原始数据
  const stack: NestedItem[] = [...initialData]; 

  // 当堆栈不为空时,持续处理
  while (stack.length > 0) {
    const current = stack.pop(); // 弹出堆栈顶部的元素

    // 检查弹出的元素是否有效,防止undefined或null
    if (!current) {
      continue;
    }

    // 如果当前元素的type属性与目标类型匹配,则将其添加到结果数组
    if (current.type === targetType) {
      result.push(current);
    }

    // 如果当前元素有子元素(即有items属性),则将这些子元素压入堆栈
    // 使用 ?? [] 确保即使items为null或undefined也能安全操作
    if (current.items && current.items.length > 0) {
        stack.push(...current.items);
    }
  }

  return result; // 返回所有找到的匹配对象
};

// 调用函数并打印结果
const textObjects = getSpecificType("text", data);
console.log(textObjects);

/* 预期输出示例 (部分):
[
  { uid: '18895f59b1a_2c5a5c7a', locked: false, rotation: 0, type: 'text', text: [ 'abc' ], ... },
  { uid: '18895ecc7c7_2d5440b6', locked: false, rotation: 0, type: 'text', text: [ 'xyz' ], ... },
  { uid: '18896072844_1298562b', locked: false, rotation: 0, type: 'text', text: [ 'group' ], ... },
  { uid: '188958badfe_3a73220b', locked: false, rotation: 0, type: 'text', text: [ 'Text' ], ... }
]
*/

你可以在 [TypeScript Playground](https://www.php.cn/link/603a99469d867c85df8c8e940f3ed965

以上就是从深度嵌套数组中高效提取特定类型对象的详细内容,更多请关注其它相关文章!


# 苏州推广网站建设报价  # 弹出  # 则将  # 是一个  # 是从  # 迭代  # 创建一个  # 新疆展示型网站建设语言  # 蚌埠关键词排名软件优化  # 组中  # 专注关键词排名选择  # SEO多久能优化到首页  # 怎么锻炼seo  # 房产淡季营销推广策略研究  # 咸宁农业网站推广员工资  # 新建网站建设家居  # 潜江品牌网站推广价格  # css  # 遍历  # 递归  # 数据结构  # yy  # json数组  # 应用开发  # ai  # 栈  # gmp  # qq  # typescript  # go  # json  # git  # js 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894 】


相关推荐: 修复UI元素交互障碍:从“开始”按钮到信息框的平滑过渡实现  微信步数怎么刷_微信步数快速提升技巧  windows10怎么关闭自动安装应用_windows10禁止推广应用下载  使用CSS :has() 选择器实现父元素样式控制:从子元素反向应用样式  支付宝登录刷脸不是本人如何解决  《KARDS》冬季扩展包“国土阵线”上线!全新“协力”机制改变战场格局  在J*a里什么是行为抽象_抽象行为对代码复用的提升作用  Lar*el怎么实现全文搜索_Lar*el Scout集成Algolia教程  Lar*el如何创建自定义的辅助函数(Helpers)_Lar*el全局函数定义与加载方法  Mac hosts文件在哪里_Mac修改hosts文件详细教程  鸿蒙单条备忘录如何加密  PHP实现等比数列:构建数组元素基于前一个值递增的方法  红手指专业版app注册教程  Teambition网盘如何共享文件  poki官网最新入口 poki小游戏大全入口  《edge浏览器》关闭翻译功能方法  c++如何链接Boost库_c++准标准库的集成与使用  PHP utf8_encode 字符编码转换疑难解析与最佳实践  Go App Engine 项目结构与包管理深度指南  漫蛙漫画官方版直通入口 2025漫蛙漫画免注册访问说明  使用TinyButStrong生成HTML并结合Dompdf创建PDF教程  macosmonterey系统外接显示器驱动怎么安装_macosmonterey外接显示器驱动与分辨率调整  Win10锁屏时间怎么设置 Win10调整自动锁屏时间方法  解决J*aScript动态图片上传中ID重复问题:在同一页面显示多张独立图片  苹果手机缓存怎么清除_苹果手机缓存如何清除iphone各版本操作步骤  sublime如何配置PHP开发环境_在sublime中运行与调试PHP代码  动漫岛在线动漫网 动漫岛动漫在线观看官方入口  mysql触发器如何编写_mysql触发器编写规范与代码示例讲解  漫蛙manwa2网页版书签同步链接_漫蛙manwa多设备登录入口  《盗墓笔记手游》技能介绍  更换小红书群背景怎么换?小红书群规则怎么设置?  QQ邮箱PC端登录页面_QQ邮箱网页版登录界面  sublime text 4如何安装_最新版sublime下载与汉化教程  如何在 WordPress 前端实现内容提交:古腾堡编辑器的替代方案与实践  《大学搜题酱》官网地址登录  苹果iPhone14ProMax如何新建AppleID_iPhone14ProMax新建AppleID具体流程  Excel如何设置动态下拉菜单_Excel表格下拉选项快速方法  yandex网页版直接登录 yandex官方入口平台访问方法  mysql怎么导入sql文件_mysql导入sql文件的方法与技巧  Mac怎么关闭按键声音_Mac键盘打字音效设置  12306夜间购票失败? | 查看官方公布的暂停服务公告与应对方案  如何发挥新媒体矩阵作用?新媒体矩阵怎么搭建?  126邮箱网页在线登录2025_126邮箱网页版入口官方地址  顺丰官方查单号入口 顺丰快递单号查询官网入口  以下哪一个是适应长期护理制度发展而设立的新职业  抖音如何进行蓝V认证 抖音企业号申请所需资料与流程  J*a中为什么强调组合优于继承_组合模式带来的灵活性与可维护性解析  Golang中的rune与byte类型区别是什么_Golang字符与字节处理详解  动漫之家观看全集库 动漫之家免费资源网地址  《荔枝fm》导出文件教程 

 2025-10-29

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.