多级嵌套对象数组:根据最里层id找出它所属的每层父级,适用于树形数据格式

news2024/10/6 2:25:23

文章目录

    • 需求
    • 分析

需求

已知一个树形格式数据如下:

// 示例数据
const data = [
  {
    "id": "1",
    "parentId": null,
    "children": [
      {
        "id": "1.1",
        "parentId": "1",
        "children": [
          {
            "id": "1.1.1",
            "parentId": "1.1",
            "children": []
          }
        ]
      },
      {
        "id": "1.2",
        "parentId": "1",
        "children": []
      }
    ]
  }
];

现需生成 [{parent:"1.1,children:["1.1.1","1.1.2"]}]的格式

分析

function findHierarchy(data, targetId) {
  // 定义一个辅助函数,用于递归查找父级对象
  function findParent(data, parentId) {
    for (const item of data) {
      if (item.id === parentId) {
        return item;
      }
      if (item.children && item.children.length > 0) {
        const parent = findParent(item.children, parentId);
        if (parent) {
          return parent;
        }
      }
    }
    return null;
  }

  // 定义一个辅助函数,用于递归生成父级对象
  function generateHierarchy(data, targetId) {
    const parent = findParent(data, targetId);
    if (parent) {
      const newObj = { id: parent.id };
      if (parent.parentId) {
        newObj.parent = generateHierarchy(data, parent.parentId);
      }
      return newObj;
    }
    return null;
  }

  // 调用辅助函数生成层级结构
  return generateHierarchy(data, targetId);
}

// 示例数据
const data = [
  {
    "id": "1",
    "parentId": null,
    "children": [
      {
        "id": "1.1",
        "parentId": "1",
        "children": [
          {
            "id": "1.1.1",
            "parentId": "1.1",
            "children": []
          }
        ]
      },
      {
        "id": "1.2",
        "parentId": "1",
        "children": []
      }
    ]
  }
];

// 测试函数
const targetId = "1.1.1";
const hierarchy = findHierarchy(data, targetId);
console.log(hierarchy);

上面的代码定义了一个 findHierarchy 函数,该函数接收一个多级嵌套的对象数组 data 和一个目标 ID targetId。函数首先定义了两个辅助函数 findParent 和 generateHierarchy,分别用于递归查找父级对象和递归生成父级对象。然后,调用 generateHierarchy 函数生成层级结构,并返回结果。

  • 输出格式如下
    在这里插入图片描述

接下来,我们需要继续处理,将生成的该格式数据转换成我们所需要的格式,逻辑如下

function processArray(array) {
    const result = [];
    const map = new Map();

    array.forEach(item => {
        const parentName = item.parent.name;
        const childName = item.name;

        if (!map.has(parentName)) {
            map.set(parentName, { parent: parentName, children: [] });
        }

        map.get(parentName).children.push(childName);
    });

    map.forEach(value => {
        result.push(value);
    });

    return result;
}

console.log(processArray(array));
  • 最终输出结果为:
    在这里插入图片描述
    页面上展示效果如下
    在这里插入图片描述
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>水位绘制</title>
  
<style>
  .water-level {
    width: 200px;
    /* 水位计的宽度 */
    height: 300px;
    /* 水位计的高度 */
    border: 2px solid #ccc;
    /* 水位计的边框样式 */
    position: relative;
  }

  .container {
    position: relative;
    width: 100%;
    height: 100%;
  }

  .water {
    background-color: blue;
    /* 水的颜色 */
    position: absolute;
    bottom: 0;
    width: 100%;
    transition: height 0.5s ease;
    /* 过渡动画效果 */
  }

  .water-level-mark {
    position: absolute;
    top: calc(100% - 20px);
    /* 水位标识线的位置,这里假设水位标识线距离底部20像素 */
    width: 100%;
    height: 2px;
    /* 水位标识线的高度 */
    background-color: red;
    /* 水位标识线的颜色 */
  }
</style>

</head>

<body>
<div class="water-level">
  <div id="list"></div>
</div>

  <script>
    // 获取导航栏中的所有链接
    var navLinks = document.querySelectorAll('.new-navbar li a');

    // 切换导航栏样式的函数
    function toggleNav (index) {
      // 先移除所有链接的 'active' 类
      navLinks.forEach(link => link.classList.remove('active'));
      // 给点击的链接添加 'active' 类
      navLinks[index].classList.add('active');
    }
    function findHierarchy (data, targetId) {
        // 定义一个辅助函数,用于递归查找父级对象
        function findParent (data, parentId) {
          for (const item of data) {
            if (item.id == parentId) {
              return item;
            }
            if (item.children && item.children.length > 0) {
              const parent = findParent(item.children, parentId);
              if (parent) {
                return parent;
              }
            }
          }
          return null;
        }

        // 定义一个辅助函数,用于递归生成父级对象
        function generateHierarchy (data, targetId) {
          const parent = findParent(data, targetId);
          if (parent) {
            const newObj = { id: parent.id };
            if (parent.parentId) {
              newObj.parent = generateHierarchy(data, parent.parentId);
            }
            return newObj;
          }
          return null;
        }

        // 调用辅助函数生成层级结构
        return generateHierarchy(data, targetId);
      }

      // 示例数据
      const data = [
        {
          "id": "1",
          "parentId": null,
          "children": [
            {
              "id": "1.1",
              "parentId": "1",
              // "children": [
              //   {
              //     "id": "1.1.1",
              //     "parentId": "1.1",
              //     "children": []
              //   }
              // ]
            },
            {
              "id": "1.2",
              "parentId": "1",
              "children": []
            }
          ]
        }
      ];

      // 测试函数
      const targetId = "1.1";
      const hierarchy  = [];
      hierarchy.push(findHierarchy(data, targetId))
      console.log(hierarchy)
      // 格式化函数
      function processArray (array) {
        const result = []
        const map = new Map()

        array.forEach(item => {
          const parentName = item.parent.id
          const childName = item.id

          if (!map.has(parentName)) {
            map.set(parentName, { parent: parentName, children: [] })
          }

          map.get(parentName).children.push(childName)
        })

        map.forEach(value => {
          result.push(value)
        })

        return result
      }

  let parentChildList = processArray(hierarchy)
  // 使用原生的模板字符串创建 HTML 字符串
    let htmlString = "<ul>";
    parentChildList.forEach(item => {
      htmlString += `<li>${item.parent}----${item.children}</li>`;
    });
    htmlString += "</ul>";

    // 将 HTML 字符串插入到 DOM 中
    document.getElementById("list").innerHTML = htmlString;
  </script>

</body>

</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1620709.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

粒子群算法与优化储能策略python实践

粒子群优化算法&#xff08;Particle Swarm Optimization&#xff0c;简称PSO&#xff09;, 是1995年J. Kennedy博士和R. C. Eberhart博士一起提出的&#xff0c;它是源于对鸟群捕食行为的研究。粒子群优化算法的基本核心是利用群体中的个体对信息的共享从而使得整个群体的运动…

Wireshark数据包分析入门

Wireshark数据包分析 1. 网络协议基础1.1. 应传网数物&#xff08;应表会传网数物&#xff09; 2. 三次握手2.1. 第一次握手2.2. 第二次握手2.3. 第三次握手2.4. 三次握手后流量特征 3. 第一层---物理层&#xff08;以太网&#xff09;4. 第二层---数据链路层&#xff08;PPP L…

139GB,台北倾斜摄影OSGB数据V0.1版

本月初发布了谷歌倾斜摄影数据OSGB转换工具V0.2版(更新&#xff01;谷歌倾斜摄影转换生成OSGB瓦片V0.2版),并免费分享了基于V0.2版转换工具生产的澳门地区OSGB数据(首发&#xff01;澳门地区OSGB数据V0.2版免费分享),V0.2版本在生产速度、显示效率和OSGB数据轻量化方面进行了优…

软考:高级系统架构师案例必备概念

根据2013年-2023年真题整理 必背案例概念 软件架构风格 软件架构风格是指描述特定软件系统组织方式的惯用模式。 组织方式描述了系统的组成构件和这些构件的组织方式。 惯用模式则反映众多系统共有的结构和语义。 架构风险 架构风险是指架构设计中潜在的、存在问题的架构…

零碳家庭 “光”的力量

有行业专家乐观预测&#xff0c;在供给充足、基础设施建设与时俱进的情况下&#xff0c;2025年&#xff0c;我国新能源汽车市场的占有率将会达到50%&#xff0c;2030年更有望突破90%的大关。为了方便新能源汽车的出行&#xff0c;在家中安装一个智能充电桩是越来越多驾驶者的选…

计算机网络---第十一天

生成树协议 stp作用&#xff1a; 作用&#xff1a;stp用于解决二层环路问题。 BPDU&#xff1a; 含义&#xff1a;桥协议数据单元&#xff0c;用于传递stp协议相关报文 分类&#xff1a;配置bpdu---用于传递stp的配置信息 tcn bpdu---用于通告拓扑变更信息 包含信息&…

基于SpringBoot的智慧物业管理设计与实现论文

摘  要 随着我国发展和城市开发&#xff0c;物业管理已形成规模&#xff0c;其效益也越来越明显。在经济效益对地方政府而言&#xff0c;主要体现为&#xff1a;减少了大量的财政补贴&#xff0c;对住宅区开发企业而言&#xff0c;能提高物业市场竞争力&#xff0c;使开发企…

系统思考—啤酒游戏

最近有不少的合作伙伴来询问我啤酒游戏这个来自于MIT&#xff08;麻省理工学院&#xff09;经典的沙盘&#xff0c;上周刚刚结束Midea旗下的一家公司市场运营部《啤酒游戏沙盘-应对动态性复杂的系统思考智慧》的课程。 参与这次沙盘体验的团队成员深刻体会到了全局思考的重要性…

dtc、fdtdump、fdtget、fdtput、convert-dtsv0

目录标题 1. dtc&#xff08;Device Tree Compiler&#xff09;2. fdtdump3. fdtget4. fdtput5. convert-dtsv0 dtc、fdtdump、fdtget、fdtput、convert-dtsv0这些工具都与Linux设备树&#xff08;Device Tree&#xff09;的处理有关。 设备树是一种数据结构&#xff0c;用于描…

JavaSE学习文档(上)

JavaSE学习文档 第一章 Java概述1.2 计算机编程语言1.3 Java语言版本概述1.4 Java语言分类1.5 JDK,JRE,JVM的关系1.6 JDK安装1.7 DOS命令1.8 Java程序执行过程1.9 编写HelloWorld1.10 常见错误1.11 编写程序时要注意的点 第二章 Java基础语法2.1 Java中的注释文档注释 2.2 关键…

免杀技术之白加黑的攻击防御

一、介绍 1. 什么是白加黑 通俗的讲白加黑中的白就是指被杀软列入到可信任列表中的文件。比如说微软自带的系统文件或者一些有有效证书签名的文件,什么是微软文件&#xff0c;或者什么是有效签名文件在后面我们会提到他的辨别方法。黑就是指我们自己的文件&#xff0c;没有有…

【办公类-26-01】20240422 UIBOT网络教研(自动登录并退出多个账号,半自动半人工)

作品展示&#xff1a; 背景需求&#xff1a; 每学期有多次网络教研 因为我有历任搭档的进修编号和登录密码&#xff0c; 所以每次学习时&#xff0c;我会把历任搭档的任务也批量完成。 但是每次登录都要从EXCEL里复制一位老师的“进修编号”“密码”&#xff0c;还要点击多次…

53.基于微信小程序与SpringBoot的戏曲文化系统设计与实现(项目 + 论文)

项目介绍 本站采用SpringBoot Vue框架&#xff0c;MYSQL数据库设计开发&#xff0c;充分保证系统的稳定性。系统具有界面清晰、操作简单&#xff0c;功能齐全的特点&#xff0c;使得基于SpringBoot Vue技术的戏曲文化系统设计与实现管理工作系统化、规范化。 技术选型 后端:…

最快2周录用!多领域EI,征稿范围广!各指标优秀!

计算机工程类EI&#xff08;最快2周录用&#xff09; 【期刊简介】最新EI期刊目录内源刊 【检索情况】EI&Scopus双检 【版面情况】仅10篇版面 【年发文量】60篇左右 【国人占比】约13% 【收录年份】2009年被EI数据库收录 【审稿周期】预计1个月左右录用 【征稿领域…

aqs 条件队列和同步队列、独占模式和共享模式

同步/条件队列 先上代码 import java.util.LinkedList; import java.util.Queue; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantLock;public class ProducerConsumerExample {private static final int CAPACITY 5;private fi…

二维码存储图片如何实现?相册二维码的制作技巧

如何将照片生成二维码后存储展示&#xff1f;现在很多人会将图片生成二维码以后&#xff0c;用于分享或者储存的用途&#xff0c;减少个人内存的占用量&#xff0c;而且分享照片也会更加的方便&#xff0c;只需要扫描二维码就可以让其他人查看图片。 想要制作图片二维码的步骤…

【C++题解】1033. 判断奇偶数

问题&#xff1a;1033. 判断奇偶数 类型&#xff1a;分支 题目描述&#xff1a; 输入一个整数&#xff0c;判断是否为偶数。是输出 y e s &#xff0c;否则输出n o。 输入&#xff1a; 输入只有一行&#xff0c;包括 1 个整数&#xff08;该整数在 1∼10000 的范围内&#…

【算法刷题 | 贪心算法02】4.24(摆动序列)

文章目录 3.摆动序列3.1题目3.2解法&#xff1a;贪心3.2.1贪心思路3.2.2代码实现 3.摆动序列 3.1题目 如果连续数字之间的差严格地在正数和负数之间交替&#xff0c;则数字序列称为 摆动序列 。 第一个差&#xff08;如果存在的话&#xff09;可能是正数或负数。仅有一个元素…

python爬虫 - 爬取html中的script数据(zum.com新闻信息 )

文章目录 1. 分析页面内容数据格式2. 使用re.findall方法&#xff0c;编写爬虫代码3. 使用re.search 方法&#xff0c;编写爬虫代码 1. 分析页面内容数据格式 &#xff08;1&#xff09;打开 https://zum.com/ &#xff08;2&#xff09;按F12&#xff08;或 在网页上右键 --…

书生·浦语大模型第二期实战营第四节-XTuner 微调 LLM:1.8B、多模态、Agent 作业-XTuner 微调个人小助手认知

视频教程&#xff1a;XTuner 微调 LLM:1.8B、多模态、Agent 文字教程&#xff1a;XTuner 微调 LLM:1.8B、多模态、Agent 作业来源&#xff1a;https://github.com/InternLM/Tutorial/blob/camp2/xtuner/homework.md XTuner 微调个人小助手认知 1. 环境安装 2.准备工作 2.1…