zoukankan      html  css  js  c++  java
  • 将有父子关系的数组对象转换成树形结构数据

    原数据:

     1 data: [{
     2     id: 1,
     3     name: '1',
     4 },
     5 {
     6     id: 2,
     7     name: '1-1',
     8     parentId: 1
     9 },
    10 {
    11     id: 3,
    12     name: '1-1-1',
    13     parentId: 2
    14 },
    15 {
    16     id: 4,
    17     name: '1-2',
    18     parentId: 1
    19 },
    20 {
    21     id: 5,
    22     name: '1-2-2',
    23     parentId: 4
    24 },
    25 {
    26     id: 6,
    27     name: '1-1-1-1',
    28     parentId: 3
    29 },
    30 {
    31     id: 7,
    32     name: '2',
    33     parentId: ''
    34 },
    35 {
    36     id: 8,
    37     name: '3'
    38 },
    39 {
    40     id: 9,
    41     name: '3-1',
    42     parentId: 7
    43 }
    44 ]

    转换方法:

     1 /**
     2  * 该方法用于将有父子关系的数组转换成树形结构的数组
     3  * 接收一个具有父子关系的数组作为参数
     4  * 返回一个树形结构的数组
     5  */
     6 translateDataToTree(data) {
     7     // 没有父节点的数据
     8     let parents = data.filter(value => value.parentId == 'undefined' || value.parentId == null ||
     9         value.parentId ==
    10         '')
    11     // 有父节点的数据
    12     let children = data.filter(value => value.parentId !== 'undefined' && value.parentId !=
    13         null || value.parentId !=
    14         '')
    15     // 定义转换方法的具体实现
    16     let translator = (parents, children) => {
    17         // 遍历父节点数据
    18         parents.forEach((parent) => {
    19             // 遍历子节点数据
    20             children.forEach((current, index) => {
    21                 // 此时找到父节点对应的一个子节点
    22                 if (current.parentId === parent.id) {
    23                     // 对子节点数据进行深复制,这里只支持部分类型的数据深复制,对深复制不了解的童靴可以先去了解下深复制
    24                     let temp = JSON.parse(JSON.stringify(children))
    25                     // 让当前子节点从temp中移除,temp作为新的子节点数据,这里是为了让递归时,子节点的遍历次数更少,如果父子关系的层级越多,越有利
    26                     temp.splice(index, 1)
    27                     // 让当前子节点作为唯一的父节点,去递归查找其对应的子节点
    28                     translator([current], temp)
    29                     // 把找到子节点放入父节点的children属性中
    30                     typeof parent.children !== 'undefined' ? parent.children
    31                         .push(
    32                             current) :
    33                         parent.children = [current]
    34                 }
    35             })
    36         })
    37     }
    38     // 调用转换方法
    39     translator(parents, children)
    40     // 返回最终的结果    
    41     return parents;
    42 }
  • 相关阅读:
    百度地图API地理位置和坐标转换
    解决Myeclipse中导入自定义的配色方案后,JSP中的js代码块为白色背景的问题
    Windows 平台下Myeclipse 10 中SVN 插件使用教程(TortoiseSVN)
    Java代码通过API操作HBase的最佳实践
    HBase中多Filter查询示例
    使用Ant编译和构建项目指南
    如何在Google Play商店发布多个版本apk
    Android 设备管理API概览(Device Administration API)
    Android呼叫管理服务之会话发起协议(SIP)API
    Android基础知识之String类使用详解
  • 原文地址:https://www.cnblogs.com/lprosper/p/10419169.html
Copyright © 2011-2022 走看看