数组转树方法(v起来)

2023-11-07

一 ,为什么需要数组转树:

      当我们做后台管理系统时难免会遇到关于公司组织架构这样的模块,一个部门下会有好几个小部门,这时我们就可以运用树形图来更好地进行查看,下面简单举例。

展开前:

 展开后:

二,下面使用两种方法进行数组转树:

    1. 非递归方式:

/**
 * 把平铺的数组结构转成树形结构
 *
 * [
 *   { 'id': '29', 'pid': '',   'name': '总裁办' },
     { 'id': '2c', 'pid': '',   'name': '财务部' },
     { 'id': '2d', 'pid': '2c', 'name': '财务核算部'},
     { 'id': '2f', 'pid': '2c', 'name': '薪资管理部'},
     { 'id': 'd2', 'pid': '',   'name': '技术部'},
     { 'id': 'd3', 'pid': 'd2', 'name': 'Java研发部'}

 * ]
 *    上面的结构说明: pid为空的为一级部门, pid等于id的为当前部门的二级部门
 */
export function tranListToTreeData(list) {
  // 1. 定义两个变量
  const treeList = []; const map = {}

  // 2. 建立一个映射关系,并给每个元素补充children属性.
  // 映射关系: 目的是让我们能通过id快速找到对应的元素
  // 补充children:让后边的计算更方便
  list.forEach(item => {
    if (!item.children) {
      item.children = []
    }
    map[item.id] = item
  })

  // 循环
  list.forEach(item => {
    // 对于每一个元素来说,先找它的上级
    //    如果能找到,说明它有上级,则要把它添加到上级的children中去
    //    如果找不到,说明它没有上级,直接添加到 treeList
    const parent = map[item.pid]
    // 如果存在上级则表示item不是最顶层的数据
    if (parent) {
      parent.children.push(item)
    } else {
      // 如果不存在上级 则是顶层数据,直接添加
      treeList.push(item)
    }
  })
  // 返回
  return treeList
}

 非递归方式代码量稍微多一点

2. 递归方式

       /* let arr=[
        *   { 'id': '29', 'pid': '', 'name': '总裁办' },
        *   { 'id': '2c', 'pid': '', 'name': '财务部' },
        *    .......
        *  ]
        */

         function tranListToTreeData(list,pid='') {
           // 先找到所有的根节点
           let tranList=list.filter(it=>it.pid===pid)
           tranList.forEach(itm =>{
            //传入id  list进行递归 在筛选出 他的父级 是一个数组
             itm.children=tranListToTreeData(list,itm.id)
           })
           return tranList
        }
        
        console.log(tranListToTreeData(arr));

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

数组转树方法(v起来) 的相关文章

  • Javascript 函数与 php 一样吗?

    我在网站上使用 WebIM 提供聊天支持 我希望能够在客户端启动聊天会话时设置一个计时器 如果操作员 技术人员在 x 秒内没有响应 我希望页面重定向到客户端可以留言的另一个页面 有点像 请稍等 我们尝试联系您 这样 如果所有技术人员都太忙或
  • 将客户端生成的响应作为下载进行流式传输,无需 Service Worker

    假设我有一个在客户端生成的大文件 我希望允许用户将其保存到他们的硬盘驱动器上 通常的方法是创建一个 Blob 然后为其创建一个对象 URL const blob new Blob chunks type application exampl
  • 如何删除事件监听器?

    下面是我的事件监听器代码 window addEventListener beforeunload function e if sessionStorage token abide call api 如果我想删除这个事件监听器 我该怎么办
  • jqgrid 在编辑框中选择不正确的下拉选项值

    我正在使用表单编辑 表单中有两个选择框 一个选择框是国家 地区 另一个选择框是州 州选择框取决于所选的国家 地区 并将动态填充 例如 Country 美国 期权价值 1 英国 期权价值 2 美国的状态 阿拉巴马州 选项值 1 加利福尼亚州
  • 如何检测不渲染 .png 透明的浏览器

    我有这段代码可以根据一周中的某一天渲染图像 但在 IE6 及更低版本以及可能其他一些浏览器中 它不会呈现 png 不透明度 所以我想稍微改变一下 这样它就会检测到不渲染 alpha 透明度的浏览器 并告诉他们加载这个图像 img horar
  • 如何使用 AngularJS、Devise 和 UI Router 全局实现身份验证?

    我对 Angular 很陌生 所以这可能是一个新手问题 我正在尝试实现一个简单的任务管理器 只是一个练习 以 Rails 作为后端 以 Angular 作为前端 到目前为止 我遵循了教程 一切正常 现在我想在全球范围内实施身份验证 这意味着
  • 通过搜索查找下一个文本并突出显示不起作用

    当在搜索框中搜索任何文本时 它可以找到并突出显示正确的文本 但是当搜索下一个 新文本时 它无法找到下一个 新文本 再次搜索时它不起作用 我无法找到问题 这JS below JS button search click function va
  • 标点符号加载“动画”,javascript?

    我正在寻找一种好方法来显示一些标点符号加载 动画 我想要的是这样的 This will display at second 1 Waiting for your input This will display at second 2 Wai
  • JavaScript 逻辑赋值是如何工作的?

    在 javascript 中 如果我们有一些代码 例如 var a one var b q a alert b 逻辑 OR 运算符会将 a 的值分配给 b 并且警报将为 一 这仅限于作业还是我们可以在任何地方使用它 似乎空字符串被视为与未定
  • 如何按单个整数字段对 JSON 进行排序? [复制]

    这个问题在这里已经有答案了 我有以下 JSON title title order 0 order 9 order 2 JSON 包含很多字段 我如何根据字段对它们进行排序order field 我一直在寻找 Nodejs 中内置的东西 但
  • 如何使用javascript隐藏div

    我想使用 Javascript 隐藏一个 div 下面是我的div div class ui dialog titlebar ui widget header ui corner all ui helper clearfix span cl
  • 两个日期之间间隔 15 分钟 javascript

    问题 我需要将两个日期 时间戳之间的所有 15 分钟时隙 日期格式 2016 08 10 16 00 00 创建为 HH mm 格式的数组 其中分钟限制为 00 15 30 45 示例 中午 12 30 到下午 2 30 将 gt 12 3
  • 需要根据用户选择有条件地渲染具有 X 行数的部分

    我有一个反应组件 其中包含一个下拉列表 其中的选项包括none 1 5 and 13 根据用户选择的数字 我需要渲染一个部分 其中包括许多行 每个行都有字段名称和下拉列表 如果用户不选择任何一个 我需要整个附加配置部分消失 新部分中的每个下
  • 如何修复带有单个道具的括号的 prettier 和 tslint 错误?

    我使用 prettier 和 tslint https github com alexjoverm tslint config prettier https github com alexjoverm tslint config prett
  • 如何在 WebView 中添加 JavaScript 函数并稍后在提交 reCAPTCHA 时从 HTML 调用它

    我在 WebView 中添加一个 JavaScript 函数 如下所示 Kotlin val webView findViewById R id webview as WebView webView getSettings setJavaS
  • 在 React JSX 中返回配对元素

    问题 在 React 中 您希望通过映射数组来创建 DOM 结构 但数组中的每个项目应返回 2 个元素 例如 import React from react import from lodash let Component React ex
  • 通过ajax执行后期操作时如何克服CORS重定向问题?

    我可以通过外部登录表单中的 post 方法类型提交表单来登录 roundcube 实例 托管在另一台服务器上 我收到此错误 通过 ajax 签名时 XMLHttpRequest 无法加载https 192 168 0 7 mail http
  • 将日期参数传递给对 MVC 操作的 ajax 调用的安全方法

    我有一个 MVC 操作 它的参数之一是DateTime如果我通过 17 07 2012 它会抛出一个异常 指出参数为空但不能有空值 但如果我通过01 07 2012它被解析为Jan 07 2012 我将日期传递给 ajax 调用DD MM
  • 允许 iframe 跨域链接到目标父框架

    我有 2 个域 域 1 上的一个页面使用 iframe 加载域 2 中的内容 如何允许来自domain2 iframe 内 的链接在domain1 的完整父框架中打开 我一直在关注IE和w3c的新沙箱属性 http www w3 org T
  • 将一维数组转换为二维数组[重复]

    这个问题在这里已经有答案了 我正在开发一个程序 我必须将文本文件中的值读入一维数组 我已经成功获取该一维数组中的数字 m1 1 2 3 4 5 6 7 8 9 但我希望数组是 m1 1 2 3 4 5 6 7 8 9 您可以使用此代码 co

随机推荐

  • Spark整理

    文章目录 1 概述 1 1 Spark 和 Hadoop 组成 1 2 Spark 和 Hadoop 区别 2 Spark 运行架构 2 1 基础架构 2 2 Master Worker Standalone模式 2 3 Applicati
  • 如何给VScode安装clang(C language)插件

    前言 1 本篇经验专门为 使用VScode开发c语言项目的学生和工程师而写 2 安装了clang C language 插件的VScode编辑器 补全功能将更加智能 正文 首先你得先安装vscode软件 安装教程请参考下链接 对于本人就不费
  • STC15单片机——定时/计数器2、3、4

    STC15单片机拥有5个定时器 分别为定时器0 1 2 3 4 本文章将记录定时器2 3 4所使用的寄存器 以及注意事项 由于STC15单片机定时器的使用于传统51单片机类似 这里仅标出应用所需的j寄存器 以及对陌生位的相关说明 其他不作过
  • 2020年下一个创业风口是什么?

    提到风口 大家总是兴致勃勃 满心期待的看完一个风口项目后 剩下的不是去选择执行 而是继续问道 还有其它的风口项目吗 所以 在我看来 对于大多数人而言 风口就是继续追问 没完没了的问还有其它的吗 今年没有抓住风口 告诉自己 不能灰心 明年拜菩
  • 支持向量机(SVM)

    SVM简介 SVM Support Vector Machine 它是一种二分类模型 其基本模型定义为特征空间上的间隔最大的线性分类器 其学习策略便是间隔最大化 最终可转化为一个凸二次规划问题的求解 这里涉及了几个概念 二分类模型 线性分类
  • 去除百度推广等广告的插件神器

    给大家推荐一款去除百度推广的神器 包括右边 及右下角弹出的广告 1 搜索ADblock进入官网https adblockplus org 点击 安装到chrome 弹出提示框点击 添加扩展程序 2 重新打开网址 你会发现之前的广告都消失了
  • 微信小程序开发一个小型商城(四、商品列表)

    上一篇文章 微信小程序开发一个小型商城 三 商品分类设计 在从上一个界面跳转过来 会看到商品列表这个界面 如下图所示 页面分析 从上到下 分别是一个已经定义好的自定义组件 下面的综合 销量 也是一个自定义组件 下面商品的一个个的小框框就是一
  • postgresql安装配置和基本操作

    1 安装 linux上安装 最好是centos7 6或者7 8 参考官网 PGSQL的官方地址 PostgreSQL The world s most advanced open source database PGSQL的国内社区 Pos
  • 【ElasticSearch】查询报错JsonpMappingException

    ElasticSearch查询报错JsonpMappingException 具体报错信息如下 co elastic clients json JsonpMappingException Error deserializing co ela
  • ajax+同步+返回数据库,如何使AJAX同步

    异常是我需要从数据库中立即返回的数据 不过 我需要 连续代码 来等待Id被返回 最好的办法是不要让这种情况发生 而是要接受事件驱动的 基于浏览器和网络编程的异步性质 非常小的选项是强制ajax请求同步 目前 在jQuery 1 x中 您可以
  • Unity 动态打图集并完成小Demo的实现

    为什么要动态打图集 比如在英雄联盟中的选择英雄界面 有很多的图标供我们选择 而我们进入游戏之后只需要选择的那两三个图标而已 这是如果我们将所有图标都打成图集 就造成内存浪费 因为我们只需要两三个而已 那么我们有什么办法让我们只将要用到的图标
  • YOLOv7改进之二十二:涨点神器——引入递归门控卷积(gnConv)

    前 言 作为当前先进的深度学习目标检测算法YOLOv7 已经集合了大量的trick 但是还是有提高和改进的空间 针对具体应用场景下的检测难点 可以不同的改进方法 此后的系列文章 将重点对YOLOv7的如何改进进行详细的介绍 目的是为了给那些
  • win10 远程桌面连接失败

    为什么远程桌面连接不上win10 防火墙 我关了 Te Service服务没开 我开 Remote Procedure Call RPC 服务没开 我再开 还不行 看图
  • 【unity】角色移动控制,移动,跳跃,地面监测

    文章目录 场景 1 character controller 2 通过键盘操控前后左右移动 3 重力作用 4 地面检测 5 跳跃 6 跳跃的时候保持地速 7 完整的代码如下 场景 做一个简单的任务移动控制 wasd的键盘移动 跳跃 地面检测
  • CCF201612-2工资计算

    试题编号 201612 2 试题名称 工资计算 时间限制 1 0s 内存限制 256 0MB 问题描述 问题描述 小明的公司每个月给小明发工资 而小明拿到的工资为交完个人所得税之后的工资 假设他一个月的税前工资 扣除五险一金后 未扣税前的工
  • 数据结构C语言-单链表的定义、销毁及增删改查

    声明部分 typedef struct Lnode int data struct Lnode next Lnode LinkList LinkList单链表 以下操作均为带头结点的单链表 LinkList CreateLinkList 创
  • 中国存储芯片产业“炮台”已搭起

    2015年以来 伴随着大陆在集成电路产业发展的高度关注与持续投入 大陆IC产业链结构正日趋完善 各产业链环节调控效果初显 尤其在晶圆制造端 浩浩荡荡的国际各路大军纷纷登陆中国 国内厂商积极重组扩张 在此期间 中国存储芯片产业也经历了从无到有
  • Python DataFrame写入OACLE数据库

    分析工具与数据库交互 Python 直接把DataFrame写入OACLE数据库 python 把模型跑出来的结果写入csv txt等文档中 不便于后续的存储和分析 于是乎我想把它直接写入数据库 但是问题来了 百度了很多写法 都是需要把Da
  • 机器学习基础(六)——逻辑回归Logistic Regression

    文章目录 Logistic Regression 1 基础概念 1 1 对数似然损失函数 1 2 完整的损失函数 2 逻辑回归算法API 3 LogisticRegression回归案例 Logistic Regression 1 基础概念
  • 数组转树方法(v起来)

    一 为什么需要数组转树 当我们做后台管理系统时难免会遇到关于公司组织架构这样的模块 一个部门下会有好几个小部门 这时我们就可以运用树形图来更好地进行查看 下面简单举例 展开前 展开后 二 下面使用两种方法进行数组转树 1 非递归方式 把平铺