我是靠谱客的博主 沉静毛衣,最近开发中收集的这篇文章主要介绍JavaScript - 递归:将平级结构转为树状结构。,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

前言:

在前端日常开发中,会频繁的重组来自服务端的基础数据结构,本篇文章记录采用递归的方式,将平级数据结构转为树状数据结构。


该方案解决的问题:

1、减少服务器压力,繁琐的数据结构重组交给客户端处理。

2、满足日常开发中处理平级结构转为树状结构的繁琐处理逻辑。

3、节约前端开发时间(cv快人一步????)。

4、优化用户对系统的整体体验感。


应用场景:将下列公司分部与总部相关联,组成树状结构;

[
    { id: '1000', pid: null, name: '西安总部' }, // 1级
    { id: '10001', pid: '1000', name: '西安雁塔分部 - 子公司' }, // 2级
    { id: '10002', pid: '1000', name: '西安莲湖分部 - 子公司' }, // 2级
    { id: '100021', pid: '10002', name: '西安莲湖分部 - 西桃园分部 - 子公司' }, // 3级
    { id: '2000', pid: null, name: '北京总部' }, // 1级
    { id: '20001', pid: '2000', name: '北京丰台分部 - 子公司' }, // 2级
    { id: '20002', pid: '2000', name: '北京朝阳分部 - 子公司' }, // 2级
    { id: '200021', pid: '20002', name: '北京朝阳分部 - 广渠路分部 - 子公司' } // 3级
]

代码逻辑:

1、首先封装一个工具函数,暂定为listToTree。

2、该工具函数接收三个值,分别是:重组前的数据、数据ID、重组后的数据。

listToTree(oldData = [], id = null, newData = []) {
    //   oldData 重组前的数据
    //   id      数据id
    //   newData 重组后的数据
}

3、首先找出第一级数据作为基础数据,判断条件为 id = null

listToTree(oldData = [], id = null, newData = []) {
    //   oldData 重组前的数据
    //   id      数据id
    //   newData 重组后的数据
    oldData.forEach(item => {  // 筛选一级数据
        if (item.pid === id) { newData.push(item) }
    })
    console.table(newData) // 打印一级数据
},

4、筛选出一级数据,并且给每一级添加 children 字段,用于存储子级。

5、遍历一级数据,递归调用listToTree工具函数,判断父级id是否与当前递归项的id相等,找到子级继而push到每项的children子级。

listToTree(oldData = [], id = null, newData = []) {
    //   oldData 重组前的数据
    //   id      数据id
    //   newData 重组后的数据
    oldData.forEach(item => { // 筛选出一级
        if (item.pid === id) { newData.push(item) } // 判断父级id与当前id是否相等
    })
    newData.forEach(i => { // 遍历一级
        i.children = [] // 添加children字段
        this.listToTree(oldData, i.id, i.children) // 递归调用
        if (i.children.length === 0) { // 如果不存在子级,则删除children字段
            delete i.children // 删除
        }
    })
    return newData // 返回结果
},

最终结果:采用el-tree组件展示效果

 最终简写方式:

listToTree(oldData = [], id = null, newData = []) {
    oldData.forEach(item => { item.pid === id && newData.push(item) })
    newData.forEach(i => {
        i.children = []
        this.listToTree(oldData, i.id, i.children)
        i.children.length || delete i.children
    })
    return newData
},

如果我的博客帮助你解决了开发问题,请不要吝啬你的小红心哦!❤❤????????


最后

以上就是沉静毛衣为你收集整理的JavaScript - 递归:将平级结构转为树状结构。的全部内容,希望文章能够帮你解决JavaScript - 递归:将平级结构转为树状结构。所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(42)

评论列表共有 0 条评论

立即
投稿
返回
顶部