js数组转tree

2023-11-16

数组转 tree目前发现就三种方式,js版本实现了三种

初始化数据

let arr = [{name: "李四", id: 2, pid: 0},//  []
    {name: "王五", id: 3, pid: 0}, // []
    {name: "赵六", id: 4, pid: 3}, // []
    {name: "吗六", id: 9, pid: 3}, // []
    {name: "张三", id: 7, pid: 9}, // []
    {name: "张五", id: 10, pid: 4}, // []
]

1. 递归模式

/**
 * 递归模式,数组转tree
 * @param arr 目标数组
 * @param pid 第一级 目标id
 * @returns {*[]} tree
 * [
 *   { name: '李四', id: 2, pid: 0, children: [] },
 *   { name: '王五', id: 3, pid: 0, children: [ [Object], [Object] ] }
 * ]
 * @constructor
 */
function ArrayToTree(arr, pid = 0) {
    // 判断是否是数组 不是数组就返回 []
    if (!Array.isArray(arr) || !arr.length) return [];
    let newArr = []
    arr.forEach(item => {
        // 判断 当前item.pid 和 传入的pid 是否相等,相等就push 进去
        if (item.pid == pid) {
            newArr.push({
                ...item, children: ArrayToTree(arr, item.id)
            })
        }
    })
    return newArr
}

2. 双重循环

/**
 * 双重for循环模式,数组转tree
 * @param arr
 * @returns {any}
 * [
 *   { name: '李四', id: 2, pid: 0 },
 *   { name: '王五', id: 3, pid: 0, children: [ [Object], [Object] ] }
 * ]
 */
function arrToTreeOne(arr,pid=0){
    if (!Array.isArray(arr) || !arr.length) return [];
    // 克隆一个新数组
    let copyArr = Object.assign([],arr)
    // 双重循环
    let newArr = copyArr.filter(item =>{
        arr.forEach(v =>{
            // 判断 id 和 pid 是否相同
            if(item.id === v.pid){
                // 相同就判断有没有 children , 有就push进去v 没有就 [v]
                if(item.children){
                    item.children.push(v)
                }else{
                    item.children = [v]
                }
            }
        })

        if (item.pid == pid) return item
    })
    return newArr
}

3. map特性模式

/**
 * map模式 ,数组转tree
 * @param arr 目标数组
 * @param pid 第一级 目标id
 * @returns {*[]}
 * [
 *   { name: '李四', id: 2, pid: 0 },
 *   { name: '王五', id: 3, pid: 0, child: [ [Object], [Object] ] }
 * ]
 * @constructor
 */
function ArrAyToTreeMap(arr,pid=0) {
    if (!Array.isArray(arr) || !arr.length) return [];
    let map = {}
    // 把map的key 是item.id value是item
    arr.forEach(item => map[item.id] = item)
    let res = []
    arr.forEach(item => {
        // item.pid 和 map的key 是否存在, 存在就 true 不存在就false
        let mapPid = map[item.pid]
        // 把pid顶级相等的插入进去
        if (item.pid == pid){
            res.push(item)
        }else {
            if (mapPid) {
                // 存在就 判断 map的child 是否存在 ,不存在就赋值一个数组,在添加 item
                ((mapPid.child || (mapPid.child = [])).push(item))
            }
        }

    })
    return res;
}

4. 过滤器的模式 

/**
 * 过滤器的模式,数组转tree
 * @param arr
 * @returns []  数组对象的 tree  ,  有需要自己在 过滤一下指定的 pid
 * [
 *   { name: '李四', id: 2, pid: 0, children: [] },
 *   { name: '王五', id: 3, pid: 0, children: [ [Object], [Object] ] }
 * ]
 */
function arrToTreeArray(arr,pid=0){
    if (!Array.isArray(arr) || !arr.length) return [];
    // 克隆一个新数组
    let copyArr = arr.filter(item =>{
        let children = arr.filter(v => item.id === v.pid)
        item.children = children.length > 0 ? item.children = children : []
        if (item.pid == pid){
            return item
        }
    })
    return copyArr
}

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

js数组转tree 的相关文章

随机推荐

  • Cesium快速入门

    Cesium是全世界使用最广泛的3D WebGIS引擎 国内有若干个GIS厂家的3D GIS引擎也是基于Cesium进行开发 随着国家 新基建 数字化 战略的不断发展深化 越来越多的城市数字化项目需要用上3D GIS引擎 对Web端而言 C
  • 简单记录搭建SSM(Spring+Spring MVC+Mybatis)整合

    业务层 View 数据显示 Controller 业务控制 执行成功怎么处理 执行失败怎么处理 Service 业务处理 Model 数据库相关实体类 增删改查 工程搭建 第一步 创建Maven web工程 点击finish创建完毕工程 第
  • C++在路径下新建一个指定名称的文件夹

    在保存数据是 我们希望将新生成的数据单独保存在一个文件夹中 其实我们可以通过程序自动生成一个指定名称的文件夹 存放数据 而不必提前手动新建文件夹并修改名称 代码实现的方法也很简单 但是需要注意的是该方法需要包含windows h头文件 代如
  • 树莓派——制作静态库、动态库

    库的特点 库是可执行代码的二进制形式 即将源代码转换成二进制的源代码 相当于对源代码进行了加密 别人可以看见库使用库 但是看不见库的源代码 2种类型库 静态库 libxxx a 动态库 libxxx so 静态库 在程序执行前就加入到目标程
  • Spring IoC是什么

    IoC是什么 Ioc Inversion of Control 即 控制反转 不是什么技术 而是一种设计思想 在Java开发中 Ioc意味着将你设计好的对象交给容器控制 而不是传统的在你的对象内部直接控制 如何理解好Ioc呢 理解好Ioc的
  • FDTD solutions——TFSF(全场散射场)光源及斜入射

    每天一遍 防止忘记 初始建立仿真文件 1 建立物理结构 几何结构 材料特性 2 定义仿真区域 边界条件 3 设置激励源 光源 4 设置监视器 至少使用一个时间监视器 分析组 只记录需要的数据 运行与仿真 1 运行仿真文件 分布式并行运算 并
  • 深度学习中的目标识别

    博主简介 博主是一名大二学生 主攻人工智能研究 感谢让我们在CSDN相遇 博主致力于在这里分享关于人工智能 c Python 爬虫等方面知识的分享 如果有需要的小伙伴可以关注博主 博主会继续更新的 如果有错误之处 大家可以指正 专栏简介 本
  • 车联网企业排行榜

    1 为紧跟车联网行业发展动态 聚焦优质市场主体 中国价值公司100排行榜之车联网企业排行榜从经营分析 发展能力以及社会责任三个维度对30家车联网重点企业进行综合评分 2 车载信息服务领域 市场主体多样 角色多元 以百度 腾讯 博泰 四维图新
  • K8s-yaml的使用及命令

    YAML配置文件管理对象 对象管理 创建deployment资源 kubectl create f nginx deployment yaml 查看deployment kubectl get deploy 查看ReplicaSet kub
  • 超详细OpenStack一键式部署

    1 准备镜像文件 Cen1 创建新的虚拟机 1 创建虚拟机 点击关闭 2 安装Centos7 密码自己设置 不用跟着一样 2 生成动态IP地址 root localhost dhclient 3 查看生成的IP地址 root localho
  • Windows安装子系统Linux

    Windows安装子系统 Linux ubuntu 安装条件 步骤 1 安装WSL命令 2 设置Linux用户名和密码 3 写个简单的 c程序看看 4 如何互传文件 安装条件 Windows 10版本2004及更高的版本才能安装 步骤 1
  • 多模态中的指令控制(InstructPix2Pix,SayCan)

    InstructPix2Pix Learning to Follow Image Editing Instructions 图像的语言指令生成 目的是遵循人工指令去编辑图像 即给定输入图像和一个如何编辑它的文本指令 模型尝试遵循这些指令来编
  • 数据治理:数据治理之道-数据文化-数据思维融入企业文化

    参考 一本书讲透数据治理 数据治理 等 大数据的根本价值在于从数据的不确定性中发现规律 获得确定性 想要在繁杂的大数据中快速找到价值数据 并依靠数据发现 分析 解决 跟踪问题 企业必须有数据思维与数据文化 数字转型 文化先行 数字化趋势下
  • Node.js学习笔记

    一 初识Node js 1 Node js是什么 1 Node js是一个基于Chrome V8 引擎的 JavaScript 运行环境 2 Node js官网 http nodejs cn 2 运行环境 注意 浏览器是JavaScript
  • 运放相位(频率)补偿电路设计

    集成运放的内部是一个多级放大器 其对数幅频特性如图 1所示中的曲线 实线 对数幅频特性曲线在零分贝以上的转折点称为极点 图中 称P1 P2点为极点 极点对应的频率称为转折频率 如fp1 fp2 第一个极点 即频率最低的极点称为主极点 在极点
  • Java实现远程调试

    https www cnblogs com wwywwy p 9626078 html 远程调试 主动连接调试 服务端配置监控端口 本地IDE连接远程监听端口进行调试 一般调试问题用这种方式 被动连接调试 本地IDE监听某端口 等待远程连接
  • 分段和分页内存管理

    两者描述 打个比方 比如说你去听课 带了一个纸质笔记本做笔记 笔记本有100张纸 课程有语文 数学 英语三门 对于这个笔记本的使用 为了便于以后复习方便 你可以有两种选择 第一种是 你从本子的第一张纸开始用 并且事先在本子上做划分 第2张到
  • 数据结构笔记:PR四叉树

    1 基本介绍 在PR四叉树中 每个节点代表一个矩形区域 并且每个节点要么没有子节点 要么有四个子节点 分别代表该矩形区域的四个象限 2 数据结构 PR四叉树的每个节点通常包含以下几个元素 区域 矩形 节点所代表的二维空间范围 点 存储在该区
  • 零售超市如何应对消费者需求?非常全面!

    随着科技的飞速发展和消费者期望的不断演变 零售行业正经历着一场深刻的革命 传统零售模式逐渐被新零售模式所取代 而其中一个备受关注的元素是自动售货机 自动售货机不仅在商场 车站和办公楼等高流量地点迅速扩张 还在重新定义我们如何购物 何时购物以
  • js数组转tree

    数组转 tree目前发现就三种方式 js版本实现了三种 初始化数据 let arr name 李四 id 2 pid 0 name 王五 id 3 pid 0 name 赵六 id 4 pid 3 name 吗六 id 9 pid 3 na