JS中的扁平化数据转换为树形结构数组

递归方法和循环方法,我都写了两种代码,仅供参考。

三种递归方法,两种循环方法,本质上都一样,就是写法不一样,加油!!!

// 数据
const arr = [{ id: 1,  name: '广东', pid: 0},{ id: 11,  name: '深圳', pid: 1},{ id: 12,  name: '东莞', pid: 1},{ id: 112, name: '宝安区', pid: 11},{ id: 2,  name: '湖南', pid: 0},{ id: 21,  name: '长沙', pid: 2},{ id: 22,  name: '岳阳', pid: 2}]

结果如下所示:

在这里插入图片描述

方法一:利用递归,类似于数据结构中的树形结构

在这里插入图片描述

核心思想:从根节点开始找子节点,一条路径找完,再返回上一级,遍历完所有数组即结束。

学习建议:递归本身我觉得有点难以理解,所以我建议学习递归的时候,在代码中打个断点,观察每一步是怎么走的,每一步的数据是什么。

// 递归有很多种解决办法
// 该问题我总结了两种递归代码
// 第一种递归代码:
const arrayToTree = (arr, pid) => {let result = []// debuggerhandleArr(arr, result, pid)return result}const handleArr = (arr, result, pid) => {arr.forEach(item => {if(item.pid === pid) {const newObj = {...item, children: []}result.push(newObj)// console.log(result)// debuggerhandleArr(arr, newObj.children, item.id)}})}console.log(arrayToTree(arr, 0))// 第二种递归代码:用forEach
const arrayToTree = (arr, pid) => {// 装节点的数组const result = []// debugger// 遍历数组找到这一级的节点arr.forEach(item => {if (item.pid === pid) { result.push(item)// 找下一级,就是再调用这个函数并传入当前id作为piditem.children = arrayToTree(arr, item.id)}})return result}console.log(arrayToTree(arr, 0))// 第三种递归:用filter,代码最短
function array2Tree(arr, pid) {return arr.filter(v => {if (v.pid === pid) {const children = array2Tree(arr, v.id)v.children = childrenreturn true}})}

方法二:利用循环,这个循环是有几层循环才能找到几级。

// 该数组有三级,所以我写了三层循环
// 方法一:用forEach方法
const result = []// 进行遍历arr.forEach( item1 => {// 找到1级if (item1.pid === 0) {result.push(item1)// 每个1级还要继续找他的2级(找children)const children1 = []arr.forEach( item2 => {if (item2.pid === item1.id) {children1.push(item2)// 把找到的二级数组放到1级这个对象children属性里item1.children = children1// 每个2级还要继续找他的3级const children2 = []arr.forEach(item3 => {if(item3.pid === item2.id) {children2.push(item3)// 把找到的三级数组放到2级这个对象children属性里item2.children = children2}})}}) }})console.log(result)// 方法二:用filter方法
const result = arr.filter(v => {if (v.pid === '') {// 找到一级// 在一级里面找二级const children = arr.filter(v2 => {// 找二级return v2.pid === v.id})v.children = childrenreturn true}})console.log(result)

如果有错误,欢迎指正。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

还在手动下载github项目?想要自动化下载github项目?基于python开发项目自动下载模块帮你实现自动下载存储

GitHub是一个基于Web的代码托管平台和开发者社区。它允许开发者存储、管理和分享他们的代码,并进行版本控制。开发者可以在GitHub上创建仓库来存储项目代码,并使用Git来跟踪和管理代码的变更历史。GitHub提供了一系列协作工具,如问题追踪、Pu…

Vue实现在线文档预览

目录 背景在线预览Office文档文件在线预览pdf文档预览方案一方案二 Word文档预览Excel文档预览PPT文档预览 纯文本、各种代码文件预览图片文件预览视频文件预览Aliplayer阿里云播放器Xgplayer西瓜播放器Bilibiliplayer仿哔哩哔哩弹幕播放器 音频文件预览在线文档预览项目&#…

POE级联蓝牙定位系统方案_蓝牙信标,蓝牙网关,级联蓝牙网关

近年来,随着新能源行业的快速发展,在化工厂,核电厂以及电力电厂等企业,对人员定位,人员导航,资产定位,生命体征监测的需求越来越大。传统的蓝牙室内定位方案中蓝牙信标为锂亚电池供电,需定期更换电池且有安全隐患,为更好的服务有蓝牙定位导航,被动人员定位,生命体征…

MySQL之概述、安装和使用(一)

一、概述 关系数据库概述: https://blog.csdn.net/qq_21370419/article/details/128568920 二、数据库的安装 参考我的两篇博客: win10 安装mysql 5.6.36版本_windows 安装mysql5.6_人……杰的博客-CSDN博客 wind 10 安装 mysql 8.0_人……杰的博客…

50从零开始学Java之万类之王Object是怎么回事?

作者:孙玉昌,昵称【一一哥】,另外【壹壹哥】也是我哦 千锋教育高级教研员、CSDN博客专家、万粉博主、阿里云专家博主、掘金优质作者 前言 在前面的文章中,壹哥跟大家说过,Java是面向对象的编程语言,而在面…

IDEA+SpringBoot+mybatis+SSM+layui+Mysql客户管理系统源码

IDEASpringBootmybatisSSMlayuiMysql客户管理系统 一、系统介绍1.环境配置 二、系统展示1. 管理员登录2.修改密码3.客户管理4.添加客户5.充值记录管理6.消费记录管理7.客户类型8.添加客户类型 三、部分代码UserMapper.javaLoginController.javaUser.java 四、其他获取源码 一、…

自动化测试工具——Fitnesse

1 介绍 是一个完全集成的独立wiki和验收测试框架。 1.1、协作工具 由于FitNesse是一个wiki web服务器,它的入门和学习曲线非常低,这使得它成为一个优秀的工具,可以与业务涉众进行协作。 1.2、测试工具 FitNesse中创建的wiki页面作为测试…

17款奔驰S400加装原厂无钥匙进入系统,提升您的便利性

奔驰无钥匙进入功能,只要身上装着车钥匙进入车内,车辆就能感应到钥匙的存在,这时只需按下启动键就可启动车辆了 奔驰无钥匙进入功能主要有两大使用体验,首先就是要注意主驾驶位车门的有效检测距离不小于1.5m,其他门钥匙…

Elasticsearch入门

部署单点es 1创建网络 、加载镜像 docker network create es-netdocker pull elasticsearch2安装ES docker run -d \--name es \-e "ES_JAVA_OPTS-Xmx512m -Xmx512m" \-e "discovery.typesingle-node" \-v es-data:/usr/share/elasticsearch/data \-v es-…

运输层:TCP的运输连接管理

1.运输层:TCP的运输连接管理 笔记来源: 湖科大教书匠:TCP的连接建立 湖科大教书匠:TCP的连接释放 声明:该学习笔记来自湖科大教书匠,笔记仅做学习参考 TCP是面向连接的协议,它基于运输连接来传…

Web3 通过truffle 脚本进行智能合约测试

上文 Web3 处理智能合约部署到本地区块链,并在本地进行测试中 我们讲解了部署智能合约 然后在终端测试的方法 但上文那种终端测试 其实并不保险 而且也比较不专业 对于这个 有一个mocha测试 这是基于node部署环境的一种环境测试 但是这个需要一定的基础 大家可以专门…

数据结构-ArrayList

目录 线性表 顺序表 ArrayList ArrayList的使用 ArrayList的构造方法 ArrayList的常用方法 ArrayList的遍历 实现简单的ArrayList 洗牌算法 删除公共字符串问题 杨辉三角 线性表 线性表是n个具有相同特性的数据元素的有限序列.线性表是一种在实际中广泛使用的数据结…