JavaScript数组扁平转树形结构数据(Tree)的实现

前言

之前面试有遇到过这个问题,面试官问:如何把一个数组数据扁平,然后转化为Tree结构数据,工作中刚好也用到了,在这里总结一下。

需求大致如下

把这个数组转为树形结构数据(Tree)

    const flatArr = [
        { id: '01', parentId: 0, name: '节点1' },
        { id: '011', parentId: '01', name: '节点1-1' },
        { id: '0111', parentId: '011', name: '节点1-1-1' },
        { id: '02', parentId: 0, name: '节点2' },
        { id: '022', parentId: '02', name: '节点2-2' },
        { id: '023', parentId: '02', name: '节点2-3' },
        { id: '0222', parentId: '022', name: '节点2-2-2' },
        { id: '03', parentId: 0, name: '节点3' },
      ]

最终结果

    [
        {
          id: '01',
          name: '节点1',
          parentId: 0,
          children: [
            {
              id: '011',
              name: '节点1-1',
              parentId: '01',
              children: [
                {
                  id: '0111',
                  name: '节点1-1-1',
                  parentId: '011',
                  children: [
                      ...
                  ],
                },
              ],
            },
          ],
        },
        {
          id: '02',
          name: '节点2',
          parentId: 0,
          children: [
              // 如上节点1
          ]
        },
        {
          id: '03',
          name: '节点3',
          parentId: 0,
          children: [
              // 如上节点1
          ]
        }
      ]

递归方式

递归方式实现是OK的,但是数据多的话会稍微慢一点哈

    const flatArr = [
        { id: '01', parentId: 0, name: '节点1' },
        { id: '011', parentId: '01', name: '节点1-1' },
        { id: '0111', parentId: '011', name: '节点1-1-1' },
        { id: '02', parentId: 0, name: '节点2' },
        { id: '022', parentId: '02', name: '节点2-2' },
        { id: '023', parentId: '02', name: '节点2-3' },
        { id: '0222', parentId: '022', name: '节点2-2-2' },
        { id: '03', parentId: 0, name: '节点3' },
      ]

    function getTreeData (arr, parentId) {
        function loop (parentId) {
          return arr.reduce((pre, cur) => {
            if (cur.parentId === parentId) {
              cur.children = loop(cur.id)
              pre.push(cur)
            }

            return pre
          }, [])
        }
        return loop(parentId)
      }

      const result = getTreeData(flatArr, 0)
      console.log('result', result)

打印结果如图

非递归方式

这种方法看起来就很简单代码也很简洁

    const flatArr = [
        { id: '01', parentId: 0, name: '节点1' },
        { id: '011', parentId: '01', name: '节点1-1' },
        { id: '0111', parentId: '011', name: '节点1-1-1' },
        { id: '02', parentId: 0, name: '节点2' },
        { id: '022', parentId: '02', name: '节点2-2' },
        { id: '023', parentId: '02', name: '节点2-3' },
        { id: '0222', parentId: '022', name: '节点2-2-2' },
        { id: '03', parentId: 0, name: '节点3' },
     ]

    function getData (arr) {
        // 利用两层filter实现
        let data = arr.filter(item => {
          item.children = arr.filter(e => {
            return item.id === e.parentId
          })
          return !item.parentId
        })

        return data
      }
      const res = getData(flatArr)
      console.log('res', res)

打印结果如图

小结

实现的方法很多,选择自己喜欢的就好,到此这篇关于JavaScript数组扁平转树形结构数据(Tree)的实现的文章就介绍到这了,更多相关JavaScript数组扁平转树形结构 内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • JavaScript中二维数组的创建技巧

    Js中二维数组的创建: 首先JavaScript只支持 一维数组 ,但我们可以通过一些方法实现矩阵以及多维数组 其中普通的创建方法并不会出现什么问题: (1) 利用一维数组嵌套一维数组的方式创建二维数组: let arr = [] ; a[0] = [1,2,3,4,5,6]; a[1] = [10,20,30,40,50,60] 然后使用一个 双层for循环 就可以迭代这个二维数组中的元素 所以用这种方法创建多维数组,不管有几个维度,都可以通过嵌套循环来遍历 遇到问题的方法: let arr1

  • JS前端二维数组生成树形结构示例详解

    目录 问题描述 实现步骤 完整代码 问题描述 前端在构建国家的省市区结构时,接口返回的不是树形结构,这个时候就需要我们进行转化.以下数据为例 [ [ { "districtId": 1586533852834, "parentCode": "000", "nodeCode": "000001", "name": "浙江省", "districtType&qu

  • Javascript中扁平化数据结构与JSON树形结构转换详解

    目录 一. 先说简单的树形结构数扁平化处理 二. 再讲将扁平化数据结构转JSON树状形结构 扩充一个知识点:for in 与 for of 的区别 : 总结 不废话,直接开干 一. 先说简单的树形结构数扁平化处理 上思想: 思想:采用递归,每个对象都有childern,只要有children属性提取出来将其放在空数组中 然后将对象的其他属性解构出来,最后将数组合并 上代码: //已知JSON树状形结构的数据data let data = [ {id:1,title:'标题1',parent_id

  • JS实现树形结构与数组结构相互转换并在树形结构中查找对象

    总是有很多需求是关于处理树形结构的,所以不得不总结几个常见操作的写法. 首先假设有一个树形结构数据如下 var tree=[ { 'id': '1', 'name': '教学素材管理', 'children':[ { 'id': '101', 'name': '教学素材', 'children':[ { 'id': '10101', 'name': '修改', }, { 'id': '10102', 'name': '添加', } ] }, { 'id': '102', 'name': '测试试

  • 关于JS中一维数组和二维数组互转问题

    一维数组转二维数组 arr1to2(arr, number) { var arr2 = []; let len = arr.length; for (let i = 0, j = 0; i < len; i += number, j++) { arr2[j] = arr.splice(0, number); } return arr2; }, 使用: let arr1 = [ 103.743896484375, 21.48374090716327, 101.05224609374999, 20.

  • JavaScript数组操作之旋转二维数组

    目录 一.题目描述​ 二.思路与实现 三.总结 一.题目描述​ 给定一个 n × n 的二维矩阵 matrix 表示一个图像.请你将图像顺时针旋转 90 度. 你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵.请不要 使用另一个矩阵来旋转图像. 示例 1: 输入:matrix = [[1,2,3],[4,5,6],[7,8,9]] 输出:[[7,4,1],[8,5,2],[9,6,3]] 示例 2: 输入:matrix = [[5,1,9,11],[2,4,8,10],[13,3,

  • JavaScript数组扁平转树形结构数据(Tree)的实现

    前言 之前面试有遇到过这个问题,面试官问:如何把一个数组数据扁平,然后转化为Tree结构数据,工作中刚好也用到了,在这里总结一下. 需求大致如下 把这个数组转为树形结构数据(Tree) const flatArr = [ { id: '01', parentId: 0, name: '节点1' }, { id: '011', parentId: '01', name: '节点1-1' }, { id: '0111', parentId: '011', name: '节点1-1-1' }, { i

  • javascript将扁平的数据转为树形结构的高效率算法

    当我们需要将一个一维数组转换成一个多层结构的时候,最简单但是最慢的就是多个for循环嵌套,但是这样做有一些缺点,那就是效率太低.而且有多少层就需要嵌套几个for循环,不好用. 我实现了用O(n)级算法将 一个扁平的数组即一维数组代表的菜单结构转换成一个多层级的菜单结构. 一位数组中每一个元素必须要包含以下属性: 拥有一个唯一的id 拥有一个parent_id, 这个id指向它父级的id 其他则为每一个元素中的一些信息,我这里是菜单,就有菜单的名称和url信息. 注: 在层级结构中,第一层的par

  • JavaScript之数组扁平化详解

    扁平化 数组的扁平化,就是将一个嵌套多层的数组 array (嵌套可以是任何层数)转换为只有一层的数组. 举个例子,假设有个名为 flatten 的函数可以做到数组扁平化,效果就会如下: var arr = [1, [2, [3, 4]]]; console.log(flatten(arr)) // [1, 2, 3, 4] 知道了效果是什么样的了,我们可以去尝试着写这个 flatten 函数了 递归 我们最一开始能想到的莫过于循环数组元素,如果还是一个数组,就递归调用该方法: // 方法 1

  • 5种 JavaScript 方式实现数组扁平化

    目录 一.数组扁平化概念 二.实现 1. reduce 2. toString & split 3. join & split 4. 递归 5. 扩展运算符 一.数组扁平化概念 数组扁平化是指将一个多维数组变为一维数组 [1, [2, 3, [4, 5]]] ------> [1, 2, 3, 4, 5] 二.实现 1. reduce 遍历数组每一项,若值为数组则递归遍历,否则concat. function flatten(arr) { return arr.reduce((res

  • JavaScript数组去重和扁平化函数介绍

    目录 1.数组扁平化(又称数组降维) 方法一:使用 reduce 方法 方法二:栈 2.数组去重 方式一:Set(ES6) 方式二:reduce 方法三:filter 1.数组扁平化(又称数组降维) flat() 方法会按照一个可指定的深度递归遍历数组,并将所有元素与遍历到的子数组中的元素合并为一个新数组返回 const test = ["a", ["b", "c"], ["d", ["e", ["

  • JavaScript数组常用方法解析及数组扁平化

    目录 前言 一.常用数组操作方法 push末尾追加元素 pop删除数组末尾元素 sort排序 shift数组开头添加元素 && unshift数组开头删除元素 数组合并concat indexOf查找元素 && includes查找元素是否存在 reverse反转数组 数组切割成字符串join slice操作数组,替换,删除,新增 every校验数组所有元素 some 测试数组中是不是至少有1个元素通过了被提供的函数测试.返回值是布尔值 深层次递归数组flat map遍历数

  • JSON复杂数据处理之Json树形结构数据转Java对象并存储到数据库的实现

    在网站开发中经常遇到级联数据的展示,比如选择城市的时候弹出的省市县选择界面.很多前端制作人员习惯于从JSON中而不是从数据库中获取省市县数据.那么在选择了省市县中的某一个城市 ,存储到数据库中需要存储所选城市的代码.所以需要一个能将JSON数据(一般存储在javascript脚本中)结构全部导入到数据库中的功能. JSON的特点是支持层级结构.支持数组表示的对象 .下面的示例介绍如何将JSON的省市县数据保存到数据库中,实现原理非常简单,就是利用JSON的java工具包API,将层次结构的JSO

  • php实现的树形结构数据存取类实例

    本文实例讲述了php实现的树形结构数据存取类.分享给大家供大家参考. 具体实现代码如下: 复制代码 代码如下: <?php /**  * Tanphp framework  *  *  * @category   Tanphp  * @package    Data_structure  * @version    $Id: Tree.php 25024 2012-11-26 22:22:22 tanbo $  */   /**  * 树形结构数据存取类  *   * 用于对树形结构数据进行快速

  • JS使用reduce()方法处理树形结构数据

    定义 reduce() 方法对数组中的每个元素执行一个由您提供的reducer函数(升序执行),将其结果汇总为单个返回值. reduce() 与forEach().map().filter()这些方法一样,也会对数组中的每一项进行遍历,但是reduce() 可以将遍历的前一个数组项产生的结果与当前遍历项进行运算. 语法 array.reduce(function(prev, cur, index, array){ ... }, init); 回调函数中的参数: prev 必需.表示调用回调时的返

随机推荐