新闻中心

将扁平化的 JSON 数据转换为嵌套结构的 JSON

2025-10-09
浏览次数:
返回列表

将扁平化的 json 数据转换为嵌套结构的 json

本文旨在提供一种将扁平化的 JSON 数据转换为具有层级嵌套结构的 JSON 数据的实用方法。通过 J*aScript 代码示例,详细讲解了如何根据 level 字段构建父子关系,从而实现 JSON 数据的层级化重构。 最终生成更易于理解和操作的树形结构数据。

在实际开发中,我们经常会遇到需要将扁平化的数据转换为树形结构的情况,尤其是在处理菜单、目录等具有层级关系的数据时。本文将提供一种使用 J*aScript 将扁平化的 JSON 数据转换为嵌套 JSON 结构的方法。 核心思路是根据数据中的层级关系(例如,level 字段)来构建父子关系,从而生成具有 subN* 属性的嵌套 JSON 结构。

实现方法

以下是一个 J*aScript 函数,可以将具有 level 属性的扁平 JSON 数组转换为嵌套的 JSON 结构:

青泥AI 青泥AI

青泥学术AI写作辅助平台

青泥AI 360 查看详情 青泥AI
function buildNestedStructure(data) {
  const topLevelItems = []; // 存储顶级节点
  const itemMap = {}; // 存储每个层级的最后一个节点,用于快速查找父节点

  for (const item of data) {
    const { title, metaData } = item;
    const newItem = { title, metaData };

    if (metaData.level === 1) {
      // 如果是顶级节点,直接添加到 topLevelItems
      topLevelItems.push(newItem);
    } else {
      // 否则,找到父节点并添加到其 subN* 属性中
      const parentLevel = metaData.level - 1;
      const parentItem = itemMap[parentLevel];

      if (!parentItem.subN*) {
        parentItem.subN* = [];
      }

      parentItem.subN*.push(newItem);
    }

    // 将当前节点添加到 itemMap 中,以便后续节点可以找到它作为父节点
    itemMap[metaData.level] = newItem;
  }

  return topLevelItems;
}

// 示例数据
const content = [
  { title: "Item 1", metaData: { "level": 1, "desc": "Some Desc 1", "displayOnOverview": true }},
  { title: "Item 2", metaData: { "level": 2, "desc": "Some Desc 2", "displayOnOverview": true }},
  { title: "Item 3", metaData: { "level": 2, "desc": "Some Desc 3", "displayOnOverview": false }},
  { title: "Item 4", metaData: { "level": 3, "desc": "Some Desc 4", "displayOnOverview": true }},
  { title: "Item 5", metaData: { "level": 1, "desc": "Some Desc 5", "displayOnOverview": true }}
];


// 调用函数并打印结果
const output = buildNestedStructure(content);
console.log(JSON.stringify(output, null, 2));

代码解释:

  1. buildNestedStructure(data) 函数: 接收一个扁平化的 JSON 数组 data 作为输入。
  2. topLevelItems 数组: 用于存储所有顶级节点(level 为 1 的节点)。
  3. itemMap 对象: 用于存储每个层级的最后一个节点。 它的键是层级值(metaData.level),值是该层级的最后一个节点对象。这使得我们能够快速找到每个节点的父节点,而无需遍历整个树。
  4. 循环遍历 data 数组:
    • 如果当前节点的 level 为 1,则将其直接添加到 topLevelItems 数组中。
    • 否则,通过 itemMap 找到其父节点(level 比当前节点小 1 的节点),并将当前节点添加到父节点的 subN* 数组中。如果父节点没有 subN* 数组,则先创建它。
  5. itemMap[metaData.level] = newItem;: 在每次循环中,将当前节点添加到 itemMap 中,以便后续节点可以找到它作为父节点。
  6. 返回 topLevelItems 数组: 该数组包含了所有顶级节点,每个顶级节点可能包含 subN* 数组,从而形成完整的嵌套结构。

注意事项

  • 确保输入数据中的 level 属性是正确的,并且层级关系是连续的。例如,如果存在 level 为 3 的节点,那么必须存在 level 为 2 的父节点。
  • 该方法假设数据是按照层级顺序排列的,即父节点出现在子节点之前。如果数据不是按照层级顺序排列的,可能需要先对数据进行排序。
  • metaData 中可以包含其他属性,如 desc 和 displayOnOverview,这些属性会被完整地保留在输出的 JSON 结构中。

总结

通过使用 buildNestedStructure 函数,我们可以方便地将扁平化的 JSON 数据转换为嵌套的 JSON 结构,从而更易于处理和展示具有层级关系的数据。 这种方法的核心在于使用 itemMap 来快速查找父节点,从而避免了不必要的遍历,提高了效率。 此外,该方法也具有一定的灵活性,可以根据实际需求进行修改和扩展。

以上就是将扁平化的 JSON 数据转换为嵌套结构的 JSON的详细内容,更多请关注其它相关文章!


# 如何用  # 商洛网站自然优化  # 福田网站建设的地方  # 银川网站建设经验  # 佛山seo代理计费  # 高港网站建设价格  # 济源关键词排名费用  # 绥化百度seo团队  # seo实战课堂网销  # 营销小红书的软文推广  # 富民商业营销推广找谁推广  # 组中  # 如何实现  # javascript  # 如何使用  # 可以找到  # 可以使用  # 重构  # 遍历  # 扁平化  # 转换为  # 排列  # json  # js  # java 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 葱吃多了会怎样 葱吃多了会伤胃吗  Windows 11怎么彻底关闭定位_Windows 11服务中禁用Geolocation  LocoySpider如何部署到云服务器_LocoySpider云部署的远程配置  C++如何解决segmentation fault_C++段错误调试与原因分析  Fabric Mod开发:在1.19.3+版本中正确添加自定义物品并管理物品组  在WordPress中通过REST API获取BasicAuth保护的远程文章  sublime如何只显示或隐藏特定类型文件_sublime侧边栏文件过滤  C++如何比较两个字符串_C++ string compare函数与操作符对比  yy漫画网页版官方入口_yy漫画官网登录页面链接  Win11如何使用Windows Sandbox Win11沙盒功能开启与使用教程【详解】  Node.js CSV 数据处理:基于字段值条件过滤整条记录的策略  漫蛙漫画官方主页入口 漫蛙MANWA网页直达访问链接  JUnit5/Mockito:优雅测试内部依赖与异常处理的实践  晋江读书网页版在线登录 晋江读书电脑版官网  虚幻5科幻题材ARPG大作遭取消!本是《奇异人生》厂商新作  TikTok国际版网页端快速入口 TikTok全球版短视频浏览教程  Python类型检查:优化关联可选属性的Mypy推断策略  必由学官网入口 必由学教师登录入口  利用5118提升短视频内容效果_5118短视频关键词优化方法  漫画星球免费下拉式入口 漫画星球免费漫画在线阅读网站  解决macOS上安装pyhdf时‘hdf.h’文件缺失的编译错误  包子漫画官方网站阅读入口-包子漫画在线漫画官网直达链接  怎么在浏览器上运行HTML文件_浏览器运行HTML文件技巧【技巧】  AWS EC2实例间SQL Server连接超时:安全组配置与故障排除指南  J*aScript异步迭代器_j*ascript异步遍历  PHP中高效并行检查多链接状态的教程  绝地鸭卫平a核爆刀流玩法攻略  PHP 枚举:根据字符串获取枚举案例的策略与实现  《北京人工智能产业白皮书(2025)》发布:全年核心产值预计突破 4500 亿元  搜狗浏览器如何使用密码生成器创建强密码 搜狗浏览器内置密码安全工具  解决Flask中Quill编辑器内容提交失败及TypeError的指南  可靠CSGO开箱平台解析 CSGO开箱网合集  汽水音乐在线版入口_汽水音乐网页播放手册  抖音DOU+怎么投最有效 抖音付费推广的ROI提升技巧  浏览器打开即用 美图秀秀网页版入口  夸克浏览器图书入口 夸克手机浏览器阅读入口  Win10怎么设置静态IP地址 Win10手动配置IP地址步骤【指南】  Python自定义类排序:解决lambda键值访问TypeError的实践指南  AO3最新可访问网址 Archive of Our Own官方在线入口  海棠账号登录入口_登录海棠账户同步阅读记录  QQ邮箱在线登录平台 QQ邮箱个人邮箱网页版入口  Safari浏览器输入栏卡顿如何解决 Safari搜索建议与缓存清理  UC浏览器官网入口2025最新 UC浏览器网页版正式地址  css子元素高度不一致导致布局错位怎么办_使用align-items:stretch解决高度差异  《燕云十六声》两周内达九百万玩家!位居畅销榜第五  ACG动漫视频网入口 ACG动漫*免费正版观看地址  抓大鹅解压小游戏 抓大鹅摸鱼解压入口  反效果?《战地6》免费试玩开启后玩家数不升反降  composer 和 npm/yarn 在管理依赖方面有什么核心思想差异?  QQ邮箱稳定登录入口_QQ邮箱官方网站网页版使用 

搜索