JavaScript 数组结构与树结构的转换

JavaScript将一层级对象数组转为children嵌套的三层级树状对象数组(多级树状分类) 有时候后端返回的数据不适合前端,我们就需要进行转换,比如我想用elementUI的级联选择器,而这个组件对数据格式有要求,本篇文章将介绍如何将一层级对象数组数据格式转为三层级嵌套children数组,JavaScript、Vue、小程序等都适用,使用情景为多级分类,嵌套数据。 阅读详情

前言

作为前端开发的同学,在与后端进行数据联调的时候,我们前端的同学处理Array数组结构的数据是最多的,list、table、card各种需要遍历的展示显示我们都会用数组来处理。当数组中涉及层级嵌套是我们的数组结构就需要进行Tree树结构的转化,常见的有目录树组件,区域选择组件等等。

这种树结构数据,前后端都可以处理,当有时候后端就是返回一个数组让前端处理的时候,我们就可以直接处理就行了。

Array结构 转 Tree结构

例如: 我们要把下面这种数组结构的转化为像tree那样嵌套的结构

/** 数组结构数据 */
const arrayData = [
  { id: 2, title: '中国', parent_id: 0 },
  { id: 3, title: '广东省', parent_id: 2 },
  { id: 4, title: '广州市', parent_id: 3 },
  { id: 5, title: '天河区', parent_id: 4 },
  { id: 6, title: '湖南省', parent_id: 2 },
  { id: 1, title: '俄罗斯', parent_id: 0 }
]
复制代码

使用递归的方法

  • 1、递归需分为两个函数来完成
  • 2、 以为返回的递归函数主要处理查找id添加children
  • 3、 由转化函数将结果返回
/**
 * 递归查找添加children
 * @param {数组数据} data 
 * @param {存放返回结果} result 
 * @param {父id} pid 
 */
function getChildren(data, result, pid) {
  for (const item of data) {
    if (item.parent_id === pid) {
      const newItem = { children: [], ...item }
      result.push(newItem)
      getChildren(data, newItem.children, item.id)
    }
  }
}

/**
 * 转化方法
 * @param {数组数据} data 
 * @param {父id} pid 
 * @returns 
 */
function arrayToTree(data, pid) {
  let result = []
  getChildren(data, result, pid)
  return result
}

console.log(arrayToTree(arrayData, 0));
复制代码

使用循环的方法

  • 1、使用数组的reduce方法将,data数组转为对象保存在对象变量obj中,每一项的id作为对象的key;
  • 2、遍历data数组,判断parent_id === 0的为第一层数组对象,push到result数组,
  • 3、继续遍历,找爹现场,在 2中我们找到数组的第一层将作为其他层级的父层,
  • 例如: 我们在第一轮的时候 const parent = obj[item.parent_id] 这个parent 对象对应的就是parent_id === 0的title = 中国或者俄罗斯节点,依此类推在这个parent对象里不断添加children属性,直到他没有parent_id与自己id一样的children
/**
 * 数组结构转为树结构
 * @param {*} data 数组数据
 * @returns 
 */
function arrayToTree(data) {
  const result = []
  const obj = data.reduce((pre, cur) => {
    pre[cur.id] = cur
    return pre
  }, {})
  for (let item of data) {
    if (item.parent_id === 0) {
      result.push(item)
      continue
    }
    if (item.parent_id in obj) {
      const parent = obj[item.parent_id];
      parent.children = parent.children || [];
      parent.children.push(item);
    }
  }
  return result
}
复制代码

转换后的结果图

image.png

Tree结构 转 Array结构

例如: 我们要把下面这种tree树结构的转化为扁平化的一维数组

/** 树状形结构数据treeData */
const treeData = [
  {
    id: 2, title: '中国', parent_id: 0,
    children: [
      {
        id: 3, title: '广东省', parent_id: 2,
        children: [
          {
            id: 4, title: '广州市', parent_id: 3,
            children: [
              { id: 5, title: '天河区', parent_id: 4 }
            ]
          }
        ]
      },
      { id: 6, title: '湖南省', parent_id: 2 }
    ]
  },
  { id: 1, title: '俄罗斯', parent_id: 0, },
]
复制代码

使用递归的方法

  • 1、 使用数组的reduce方法, 解构数组的每一项,如果有children,就用concat 一层一层的抽取出来,使得每个对象项都包裹在一个[]下
/**
 * 树结构数组扁平化
 * @param {*} data 树结构的数组
 * @returns 
 */
function treeToArray(data) {
  return data.reduce((pre, cur) => {
    const { children = [], ...item } = cur;  
    return pre.concat([{ ...item }], treeToArray(children)) 
  }, []);
}
复制代码

reduce() 方法对数组中的每个元素按序执行一个由您提供的 reducer 函数,每一次运行 reducer 会将先前元素的计算结果作为参数传入,最后将其结果汇总为单个返回值。

concat() 方法用于合并两个或多个数组。此方法不会更改现有数组,而是返回一个新数组。

数组的相关方法

使用循环的方法

image.png

Tree结构根据ID找路径

使用目录的时候会有这样的需求,根据id查找所在目录路径,也是递归实现。

  • 1、遍历树结构数组,判断id 是否为当前项的id,是就返回当前目录名词
  • 2、判断当前项是否有children依此递归。
/**
 * 根据id查找所在目录路径
 * @param {树结构的数组数据} tree 
 * @param {要查找的id} id 
 * @param {初始路径} path 
 * @returns 
 */
function parseTreePath(tree, id, path = "") {
  for (let i = 0; i < tree.length; i++) {
    let tempPath = path;
    // 避免出现在最前面的/
    tempPath = `${tempPath ? tempPath + "/ " : tempPath}${tree[i].title}`; 
    if (tree[i].id == id) return tempPath;
    else if (tree[i].children) {
      let reuslt = parseTreePath(tree[i].children, id, tempPath);
      if (reuslt) return reuslt;
    }
  }
};
console.log(parseTreePath(treeData, 5));
复制代码
来源:https://juejin.cn/post/7139084006716342309
【进阶篇】js数组转换为树结构函数 我们常常在做后台管理系统的时候 需要对数据进行组装成一个树装结构,这里特地将此方法进行封装: let data = [ { id: 1, text: 't11', parentId: 0 }, { id: 2, text: 't11', parentId: 0 }, { id: 3, text: 't11', parentId: 1 }, { id: 4, te... 阅读详情

相关推荐

3.(vue3.x+vite)el-tree组件(数组结构数据转树结构数据)

3.(vue3.x+vite)el-tree组件(数组结构数据转树结构数据)

GIS之家家长 368

JS 数组转树状结构

JS 数组转树状结构 需求: 将如下数组转成树状结构 // 需转化数组示例 data = [ { id: '01', lable: '项目经理', pid: '' }, { id: '02', lable: '产品leader', pid: '01' }, { id: '03', lable: 'UIleader', pid: '01' }, { id: '04', lable: '技术leader', pid: '01' }, { id: '05', lable: '

m0_59128154的博客 5357

JavaScript 数组和树的转换

通过以上的代码示例,我们可以在JavaScript中实现数组和树之间的转换。无论是从数组转换为树,还是从树转换为数组,递归遍历是实现这一转换的关键。通过递归,我们可以对每个节点进行处理,并构建出相应的数据结构。在JavaScript编程中,经常需要在数组和树之间进行转换。本文将详细介绍如何在JavaScript中进行数组和树之间的转换,并提供相应的源代码示例。首先,我们来看如何将一个数组转换为树结构。接下来,我们来看如何将一个树结构转换为数组。通过递归遍历树节点,我们可以将树结构转换为对应的数组结构。

python_bug262的博客 123

js-数组转树型结构

解释了数组转树型结构原理、应用场景和实现代码

weixin_70134200的博客 1989

把扁平化的数据转换成树形结构的JSON

把扁平化的数据转换成树形结构的JSON

告别Keil4!手把手教你用Keil C51 V9.61编译51单片机代码(附最新激活方法)

本文详细介绍了Keil C51 V9.61在51单片机开发中的全栈升级指南,包括编译速度提升、调试器性能优化和现代开发支持等核心优势。通过智能安装方案、项目迁移实战和新特性深度应用,帮助开发者告别Keil4,大幅提升开发效率。附有最新激活方法和实用技巧,适用于嵌入式开发工程师。

weixin_26886855的博客 419

JavaScript 实现 数组与树结构的相互转换

方法二:使用字典索引。

chelseySola的博客 300

MediaPipeUnityPlugin(最新版)摇摆拳人脸识别

MediaPipeUnityPlugin(最新版)摇摆拳人脸识别

不忘初心 方得始终 2978

js数组和树结构数据相互转换

数组转树结构采取递归和非递归两种方式,树结构转扁平化数组采取深度优先遍历(递归和非递归两种方式)和广度优先遍历实现。 let arr =[ {id:2,name:'部门B',parentId:0}, {id:3,name:'部门C',parentId:1}, {id:1,name:'部门A',parentId:2}, {id:4,name:'部门D',parentI...

susuzhe 1万+

Wiley:International Journal for Numerical Methods in Biomedical Engineering投稿流程

中间过程省略,这个出版社很人性化,投稿的web UI也很好看。上传word之后,一步步跟着走就行,不用填太多东西。不要最后在最后检查阶段,重新上传word文件,这样会导致,之前针对word的操作全部改变。

Everyday try to become better -Kobe Bryant 2543

三角洲自动购买工具 —— 基于 OCR 的价格识别与自动点击

通过的方式,我们可以轻松实现自动化的“价格监控 + 自动点击”工具。它的优势在于通用性—— 只要能截屏识别价格,就能用于任何程序,不依赖特定 API。未来可以扩展的功能:自动保存配置到文件。支持多价格区域检测。增加快捷键启停功能。

qq_62975494的博客 2417

JS实现数组与树结构的相互转换

1、数组转换为树结构 let data = [ { id: 0, parentId: null, name: '生物' }, { id: 1, parentId: 0, name: '动物' }, { id: 2, parentId: 0, name: '植物' }, { id: 3, parentId: 0, name: '微生物' }, { id: 4, parentId: 1, name: '哺乳动物' }, { id: 5, parentId: 1, name: '卵

大灰狼的小绵羊哥哥的博客 6048

富斯遥控器-ros机器人控制

富斯遥控器-ros机器人手柄控制

zkh7758的博客 1698

Web前端之JavaScript实现扁平数组结构与JSON树形结构相互转换、递归、continue、reduce、concat、push

Web前端之JavaScript实现扁平数组结构与JSON树形结构相互转换、递归、continue、reduce、concat、push

优快云博客主页地址:https://mengjian.blog.youkuaiyun.com/ 697

MATLAB船舶开尔文尾迹三维仿真建模

开尔文尾迹介绍 Kelvin最早研究舰船在水面运动在水面上形成波纹的原理,主要针对静水中点源运动的尾迹问题,并给出尾迹的张角和波高分布情况。由 Kelvin 的理论,一般情况下假设由一个理想点源来代替舰船,开尔文尾迹由分歧波和横断波组成,分歧波向船的两侧扩散,而横断波主要向船的后方传播,在相遇的地方两波相干形成尖头波,且尖头波位于尾迹角16°到19.5°之间,又因为尖头波波长过短,以至于无法单独的区分出每个尖头波的波前,所有的波前在视觉效果上就连成一条直线表现为亮线,称为开尔文臂,开尔文臂以船身对称,且角度

qq_19512613的博客 3844

ROS机器人里程计模型

3.5 移动机器人系统模型 相信大家的机器人平台STM32端底层控制和机器人urdf建模都已经顺利完成了,在正式开始ros端编写机器人启动功能包之前,我们还不得不学习一些必要的理论知识。别担心数学不好,这里基本都是高中数学。下面我们开始,Are you ready? 没准备好也开始了。 3.5.1 常用坐标系系统模型 在移动机器人技术研究中,最为常用的坐标系统是笛卡尔坐标系统。而在SLAM算法研究中,有如下几个比较常见的笛卡尔坐标系统,它们分别为机器人坐标系XR YR OR 、传感器坐标系XS YS OS

「小白学移动机器人」一个专注分享移动机器人相关知识的公众号! 1万+

使用js进行二叉树结构数据与数组结构数据的互相转化

简单的说下树形数据的结构:"type": "logic", "content": "and", "left": { "type": "leaf", "content": "=", "left": "ID", "right": "123" }, "right": { "type": "leaf", "content": "~", "left":

justforuse的博客 6983

【100%通过率】华为OD机试真题 JS 实现【水库蓄水问题】【2023 Q1 | 100分】

给定一个长度为 n 的整数数组height。数组的元素表示山的高度,选择两个元素作为水库的边界,求蓄水量的最大值并输出蓄水量最大时的边界下标(蓄水量相同时输出下标较近的)。

MISAYAONE的博客 8170

树形数组结构和扁平数组结构的转换

关于树形数组结构和扁平数组结构之间的转换

Coffee coder 643

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

使用ES6 将数组转换为树结构

将数组转换为树结构的实现方式很多,多数实现方式都是采用递归的方式来实现。本文基于ES6来实现数组结构转换为树结构,利用对象的key唯一性特性以及根节点没有父节点的特性将子节点追加到父节点的方式,具体实现方式如下: const list2Tree = (list: any[], { id = 'id', pid = 'pid', isLeaf = 'isLeaf' }) => { const treeList: any[] = []; const dataMap = {}; if (lis

义陆·逍遥 2342

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

leetcode数组结构转为二叉树树结构

我们的转换程序主要是应用在本地,为了方便本地的调试,因此在使用时,尤其要注意数据的范围,若真的用到了 INT_MAX 对应的数据,请把转换程序中代替 null 的。leetcode关于二叉树编程中,测试用例中的数组是如何转换成二叉树的,实际上是通过层次遍历来把数组转换成二叉树。来代替 null,需要转换的数组中的 null 也请用 INT_MAX 来代替。在 C++中的 vector 数据结构里,只能有一种类型,这里我们用。

suvil的专栏 385

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

el-tree树数据与对象数组结构转换

有时候我们遇到后台返回不是标准结构,但是我们组件又是树结构类型的数据怎么办呢?这时候就需要转换一下结构了。

xiaolinwuhu的博客 505

js数组转换为树结构

javascript 数组转换为树结构 适用于各大前端框架 vue ant elm 等等。。。。。

LBOcean的博客 566
上一篇: List 去重的 6 种方法,这个方法最完美!
下一篇: 2022年能让你早点下班的36个JavaScript实用函数!
码趣资源网
博客等级 码龄4年 268粉丝 518原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值