Java & JavaScript 递归构建树状图(根据parentId)

46 篇文章 5 订阅
7 篇文章 2 订阅
该博客介绍了如何使用JavaScript和Java来构建树状结构,特别是针对具有parentId属性的数据。首先,找到所有根节点,然后通过递归遍历数据,根据parentId关系构建子树。在JavaScript中,利用TaskManageModal类和相关方法实现;在Java中,使用Menu类和MenuTree类完成树形结构的构建,并通过Fastjson库进行结果的JSON转换。
摘要由CSDN通过智能技术生成

1. Java & JavaScript 递归构建树状图(根据parentId)


类似于实现这样的效果

实现思路:

  1. 第一步:找到所有根节点(parentId == null)
  2. 第二步:遍历跟结点,递归生成根节点的子树

在这里插入图片描述


1.1 JavaScript 实现

export class TaskManageModal {
  taskId: any = ''; // 任务id
  parentId: any = ''; // 父级任务id
  children: Array<TaskManageModal> = [];// 是否含有子列表
}

taskInfoList: Array<TaskManageModal> = 待处理的数据;

//建立树形结构
buildTree(): Array<TaskManageModal> {
  let treeList: Array<TaskManageModal> = [];
  let rootNodes = this.getRootNode();
  for (let j = 0; j < rootNodes.length; j++) {
    treeList.push(this.buildChildTree(rootNodes[j]));
  }
  return treeList;
}
// 获取根节点(一级树)
getRootNode(): Array<TaskManageModal> {
  let rootList: Array<TaskManageModal> = [];
  for (let j = 0; j < this.taskInfoList.length; j++) {
    if (this.taskInfoList[j].parentId == undefined) {
      rootList.push(this.taskInfoList[j]);
    }
  }
  return rootList;
}
// 递归,建立子树形结构
buildChildTree(task: TaskManageModal): TaskManageModal {
  let childList: Array<TaskManageModal> = [];
  for (let j = 0; j < this.taskInfoList.length; j++) {
    if (this.taskInfoList[j].parentId == task.taskId) {
      childList.push(this.buildChildTree(this.taskInfoList[j]));
    }
  }
  task.children = childList;
  return task;
}

1.2 Java代码实现

我用到的依赖

pom.xml

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.60</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.20</version>
            <scope>provided</scope>
        </dependency>

1.2.1 实体类Menu

Menu.java

import lombok.Data;

import java.util.List;

@Data
public class Menu {
    private String id;
    private String parentId;
    private String text;
    private List<Menu> children;

    public Menu(String id, String parentId, String text) {
        this.id = id;
        this.parentId = parentId;
        this.text = text;
    }
}

1.2.2 生成树形结构的类

MenuTree.java

import java.util.ArrayList;
import java.util.List;

public class MenuTree {
    private List<Menu> menuList = new ArrayList<Menu>();

    public MenuTree(List<Menu> menuList) {
        this.menuList = menuList;
    }

    //建立树形结构
    public List<Menu> builTree() {
        List<Menu> treeMenus = new ArrayList<Menu>();
        for (Menu menuNode : getRootNode()) {
            menuNode = buildChilTree(menuNode);
            treeMenus.add(menuNode);
        }
        return treeMenus;
    }

    //递归,建立子树形结构
    private Menu buildChilTree(Menu pNode) {
        List<Menu> chilMenus = new ArrayList<Menu>();
        for (Menu menuNode : menuList) {
            if (menuNode.getParentId().equals(pNode.getId())) {
                chilMenus.add(buildChilTree(menuNode));
            }
        }
        pNode.setChildren(chilMenus);
        return pNode;
    }

    //获取根节点
    private List<Menu> getRootNode() {
        List<Menu> rootMenuLists = new ArrayList<Menu>();
        for (Menu menuNode : menuList) {
            if (menuNode.getParentId().equals("0")) {
                rootMenuLists.add(menuNode);
            }
        }
        return rootMenuLists;
    }
}

1.2.3 测试类

Test.java

import com.alibaba.fastjson.JSON;

import java.util.ArrayList;
import java.util.List;

public class Test {
    public static void main(String[] args) {
        List<Menu> menuList = new ArrayList<Menu>();
        /*插入一些数据*/
        menuList.add(new Menu("GN001D000", "0", "系统管理"));
        menuList.add(new Menu("GN001D100", "GN001D000", "权限管理"));
        menuList.add(new Menu("GN001D110", "GN001D100", "密码修改"));
        menuList.add(new Menu("GN001D120", "GN001D100", "新加用户"));
        menuList.add(new Menu("GN001D200", "GN001D000", "系统监控"));
        menuList.add(new Menu("GN001D210", "GN001D200", "在线用户"));
        menuList.add(new Menu("GN002D000", "0", "订阅区"));
        menuList.add(new Menu("GN003D000", "0", "未知领域"));
        /*让我们创建树*/
        MenuTree menuTree = new MenuTree(menuList);
        menuList = menuTree.builTree();
        /*转为json看看效果*/
        String jsonOutput = JSON.toJSONString(menuList);
        System.out.println(jsonOutput);
    }
}

运行结果:
在这里插入图片描述

格式化展示:

[
  {
    "children": [
      {
        "children": [
          {
            "children": [],
            "id": "GN001D110",
            "parentId": "GN001D100",
            "text": "密码修改"
          },
          {
            "children": [],
            "id": "GN001D120",
            "parentId": "GN001D100",
            "text": "新加用户"
          }
        ],
        "id": "GN001D100",
        "parentId": "GN001D000",
        "text": "权限管理"
      },
      {
        "children": [
          {
            "children": [],
            "id": "GN001D210",
            "parentId": "GN001D200",
            "text": "在线用户"
          }
        ],
        "id": "GN001D200",
        "parentId": "GN001D000",
        "text": "系统监控"
      }
    ],
    "id": "GN001D000",
    "parentId": "0",
    "text": "系统管理"
  },
  {
    "children": [],
    "id": "GN002D000",
    "parentId": "0",
    "text": "订阅区"
  },
  {
    "children": [],
    "id": "GN003D000",
    "parentId": "0",
    "text": "未知领域"
  }
]



评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CodeJiao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值