JavaScript中的扁平化数据转换为树形结构、树形结构扁平化数据

2023-11-13

1. 扁平化数据 ---- > 树形结构

1.1 第一种数据类型

  • 原始数据只有idpId相互关联
      let data = [
            { id: 639, name: "商品管理", type: 0, pId: 638, code: "1", domain: "" },
            { id: 640, name: "商品分类", type: 0, pId: 639, code: "2", domain: "" },
            { id: 642, name: "增加分类", type: 0, pId: 640, code: "3", domain: "" },
            { id: 645, name: "编辑分类", type: 0, pId: 640, code: "4", domain: "" },
            { id: 646, name: "消息管理", type: 0, pId: 655, code: "4", domain: "" },
        ]
  1. 第一种方法,网上找的
 function  toTree(data) {
      const map = {}
      const val = []
      data.forEach((item) => {
        map[item.id] = item
      })
      data.forEach((item) => {
        const parent = map[item.pId]
        if (parent) {
          (parent.children || (parent.children = [])).push(item)
        } else {
          val.push(item)
        }
      })
      return val
    },
  1. 自己写的比较奇葩
/* 
两层循环找出id和pId相同的放入到外层循环的children中
但是此时要删除那些已经放入到children中的列表项,并删除那些children为空的属性
才能得到最后的结果
*/
  function  toTree1(data){
            let del = []
            data.forEach(el => {
                el.children = []
                data.forEach((item) => {
                    if (item.pId == el.id) {
                        el.children.push(item)
                        
                        del.push(item.id)// 删除那些要推进列表中的即可这些是重复的item删除
                    }
                })
                 // 删除那些children为空的数据
                if(el['children'].length == 0){
                    delete el['children']
                }
            })
            // 过滤那些已经push到el.children中的
           let result= data.filter(item=>!del.includes(item.id))
           return result
        }

使用:

        console.log(toTree(data), '第一种方法');
        console.log(toTree1(data), '第二种方法');

结果:
在这里插入图片描述


  • tips: 这种方法对于那种parentId==0的也是可以的。把代码中的pId改为parnetId即可。

在这里插入图片描述

2. 树形结构---->扁平化数据

我可写出了个递归……哭。刚开始可以先写两层转换、看看思路对不,最后再抽取那些重复的代码封装成函数递归。

  • 刚开始:
 function flattTree(data){
            let res=[]//保存最后的数据

            data.forEach(el=>{
                if(el.children){
                   res.push(el)//当前父亲肯定要push到res里面的 是要把孩子删除了吗再
                  
                   //第二层循环,发现这是重复的地方,使用递归了在这个点
                   el.children.forEach(item=>{
                       if(item.children){
                           res.push(item)
                       }else{
                           res.push(el.children)
                       }
                   })
                }else{
                    res.push(el)
                }
            })
            console.log(res,'未使用递归的时候的粗糙的代码');
        }
      
        let treeData=toTree(data)//树形结构原始数据
        flattTree(treeData)

在这里插入图片描述

  • 最后的递归:
        let treeData=toTree(data)//原始数据结构    
        let res=[]
        
        flattTree(treeData,res)
        console.log(res,'扁平化的数据');

 function flattTree(data,res){
            data.forEach(el=>{
                if(el.children){
                   res.push(el)
                   
                   flattTree(el.children,res)//递归

                   //要把孩子children删除掉
                   delete el['children']
                }else{
                    res.push(el)
                }
            })
        }

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JavaScript中的扁平化数据转换为树形结构、树形结构扁平化数据 的相关文章

随机推荐

  • 去银行写代码是种什么体验?

    本文转载自程序员技术 一线互联网岗位和银行 国企还是有点区别的 这篇文章 讲详细讲一讲银行或者金融科技的相关问题 包括面试 待遇等等 虽然前阵子网传几大互联网公司都去掉了大小周 但是我和某团的一个哥们儿聊 其实本质是把周末要加的班 放在了平
  • 登录Unity官方商店时提示Sorry, this link is no longer valid.(此链接已失效)

    看了看网上的资料 主要有以下四种方法 第一种非常有效 1 彻底断开当前使用的wifi或者有线网络 打开手机热点 让电脑连接热点 重新登录 就可以进去了 2 关闭魔法 3 打开系统防火墙 设置Unity相关程序为允许专用网络和允许公用网络 都
  • 哨兵-1 Sentinel-1数据下载(欧空局)

    Sentinel 1数据下载 1 Sentinel 1 数据简介 2 Sentinel 1 数据下载步骤 2 1 在欧空局 ESA 下载Sentinel 1 数据 2 1 1网站页面介绍 2 1 2 数据下载步骤 1 Sentinel 1
  • Python pyinstaller打包opencv程序出错(ImportError: OpenCV loader: missing configuration file: [‘config.py‘)

    在打包含有opencv库的程序时 打包 F w 后运行程序报错 运行失败 查看命令行提示 打包时只 F 错误为 ImportError OpenCV loader missing configuration file config py C
  • 数据结构之栈

    栈 什么是栈 1 后进者先出 先进者后出 这就是典型的 栈 结构 2 从栈的操作特性来看 是一种 操作受限 的线性表 只允许在端插入和删除数据 为什么需要栈 1 栈是一种操作受限的数据结构 其操作特性用数组和链表均可实现 2 但 任何数据结
  • Windows应急响应信息采集工具

    项目地址 GitHub ra66itmachine GetInfo Windows Emergency Response 应急响应信息采集 Windows information collection 快速收集 Windows 相关信息 为
  • 全通系统定义、零极点关系、应用

    全通系统定义 表示方法 应用一 将任意因果稳定系统转化为 全通系统和最小相位系统 的级联 应用二 级联一个全通系统可以使非稳定滤波器变成一个稳定滤波器 把非稳定系统的单位圆外的极点映射到单位圆内 应用三 作为相位均衡器 校正系统的非线性相位
  • Android一键清理原理

    欢迎转载 转载请注明 http blog csdn net zhgxhuaa 说明 在总篇中提到过垃圾清理 本篇将着重介绍针对缓存 卸载残留 无用数据等 静态内容 的清理 有关于系统进程的清理以及手机加速的相关功能 将放到 手机加速篇 中介
  • 在腾讯云服务器上安装docker

    一 准备事项 1 1 查看系统版本 uname a docker官方说至少3 8以上 建议3 10以上 root VM 0 11 centos docker uname a Linux VM 0 11 centos 3 10 0 1062
  • 前端面经高频考点

    文章目录 HTML 1 高频1之行内元素 块级元素 行内块元素的区别 2 高频2之script标签中defer和async的区别 3 src和href的区别 4 lable的作用 5 ifram的使用以及有优缺点 6 img的srcset属
  • Java题目练习

    编程题目 题目1 编写MobilePhone类 包含brand 品牌 和price 价格 属性 该类实现Comparable接口规定该类对象大小 即手机能按照价格来排序 2 创建一个只可放 MobilePhone 类的链表 链表当中添加3个
  • geckodriver的安装和测试其是否安装成功

    1 首先下载最新的geckodriver 你可以百度 或者我分享给你 但是如果你看到这篇文的时候 已经更新版本了 你可以去百度一下 总有人在分享的 链接 https pan baidu com s 1L9GLCpLNmgL2szxD6wvK
  • 《科学伦理与学术规范》 课后习题_答案 2022春季

    资料来源网络 侵删 科学伦理与学术规范答案汇总 2022 第一部分 必做 ABC A B D ABCD ABC D A BCD C D D 第二部分 必做 ABCD ABCD ABCD BCD AD A ABCD ACD AC A AC D
  • 了解接口工具Apifox

    最近发现一款接口测试工具 apifox 我我们很难将它描述为一款接口管理工具 或 接口自测试工具 官方给了一个简单的公式 更能说明apifox可以做什么 Apifox Postman Swagger Mock JMeter Apifox的特
  • /usr/bin/ld: cannot find -lmysqlcllient

    文章目录 1 question usr bin ld cannot find lmysqlcllient 2 solution 1 question usr bin ld cannot find lmysqlcllient 2 soluti
  • Unity脚本的属性

    参考官网 http game ceeger com Script Attributes Attributes html http blogs unity3d com 2014 06 24 serialization in unity 参考文
  • 解决UE4启动出现UE4Editor.exe-无法找到dll入口的弹窗

    UE4编辑器启动 一开始遇到的问题如下 上网找问题得到的解答都是在cmd下利用regsvr32 exe注册该dll到注册表 但是也提示报错 上网搜了一下 得知原因是生成该dll的源码没有实现 DllRegisterServer和DllUne
  • 镜像iso文件下载地址

    CentOS 7官方下载地址 https www centos org download Centos国内下载源 以下链接均可下载镜像文件 http man linuxde net download CentOS http centos u
  • 面向对象程序设计语言(Java)-1.概述

    概述 1 Java的两层含义 2 Java语言的特点 3 Java的应用平台 4 Java的工作原理 5 Java环境中的概念 6 初始Java程序 7 Java程序的基本组成 8 开发Java程序的步骤 9 注释 1 Java的两层含义
  • JavaScript中的扁平化数据转换为树形结构、树形结构扁平化数据

    1 扁平化数据 gt 树形结构 1 1 第一种数据类型 原始数据只有id和pId相互关联 let data id 639 name 商品管理 type 0 pId 638 code 1 domain id 640 name 商品分类 typ