java递归、js递归,无限极分类菜单表

java-json

import com.alibaba.fastjson.JSONObject;

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

/**
 * @Description: 菜单工具类
 * @version: V1.0
 */
public class MenuTreeUtil {
    /**
     * @return
     * @Author
     * @Param nodes :所有的节点列表
     */
    public List data(List<JSONObject> nodes) {
        ArrayList<JSONObject> rootNode = new ArrayList<>();
        for (JSONObject node : nodes) {
            if (node.getString("parentId").equals("-1")) {
                node.remove("checked");
                rootNode.add(node);
            }
        }
        for (JSONObject node : rootNode) {
            List<JSONObject> child = getChild(String.valueOf(node.getString("id")), nodes);
            if (child != null && !child.isEmpty() && child.size() > 0) {
                node.remove("checked");
            }
            node.put("children", child);
        }
        return rootNode;
    }

    /**
     * @return
     * @Author
     * @Description //TODO 获取根节点的子节点
     * @Param
     */
    public List<JSONObject> getChild(String id, List<JSONObject> allNode) {
        //存放子菜单的集合
        ArrayList<JSONObject> listChild = new ArrayList<>();
        for (JSONObject node : allNode) {
            if (node.getString("parentId").equals(id)) {
                listChild.add(node);
            }
        }
        //递归:
        for (JSONObject node : listChild) {
            List<JSONObject> child = getChild(String.valueOf(node.getString("id")), allNode);
            if (child != null && !child.isEmpty() && child.size() > 0) {
                node.remove("checked");
            }
            node.put("children", child);
        }
        if (listChild.size() == 0) {
            return null;
        }
        return listChild;
    }
}

使用

MenuTreeUtil menuTreeUtil = new MenuTreeUtil();
List data = menuTreeUtil.data(JSON.parseArray(JSON.toJSONString(menus1), JSONObject.class));

java-object

import lombok.Data;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

@Data
public class PermissionVo implements Serializable {
    private static final long serialVersionUID = 106717167007024517L;

    private String id;

    private String title;
    private String parentId;

    /**
     * 权限菜单是否选中
     */
    private boolean checked;
    /**
     * 是否展开,默认展开
     */
    private boolean spread=true;

    private List<PermissionVo> children = new ArrayList<>();
}
import java.util.ArrayList;
import java.util.List;

/**
 * @ClassName: PermissionVo
 * @Description: 菜单工具类
 * @version: V1.0
 */
public class MenuTreeUtil {
    /**
     * @return
     * @Author
     * @Description //TODO
     * @Param nodes :所有的节点列表
     */
    public List data(List<PermissionVo> nodes) {
        ArrayList<PermissionVo> rootNode = new ArrayList<>();
        for (PermissionVo node : nodes) {
            if (node.getParentId().equals("-1")) {
                rootNode.add(node);
            }
        }
        for (PermissionVo node : rootNode) {
            List<PermissionVo> child = getChild(String.valueOf(node.getId()), nodes);
            node.setChildren(child);
        }
        return rootNode;
    }

    /**
     * @return
     * @Author
     * @Description //TODO 获取根节点的子节点
     * @Param
     */
    public List<PermissionVo> getChild(String id, List<PermissionVo> allNode) {
        //存放子菜单的集合
        ArrayList<PermissionVo> listChild = new ArrayList<>();
        for (PermissionVo node : allNode) {
            if (node.getParentId().equals(id)) {
                listChild.add(node);
            }
        }
        //递归:
        for (PermissionVo node : listChild) {
            node.setChildren(getChild(String.valueOf(node.getId()), allNode));
        }
        if (listChild.size() == 0) {
            return null;
        }
        return listChild;
    }
}

js

function recursion(nodes) {
  var temp = [];
   temp.push(nodes);
   var rootNode = []

   for(var i = 0; i < temp.length; i++) {
     rootNode.push(temp[i]);
   }

   for(var i = 0; i < rootNode.length; i++) {
       var childArrs = [];
       childArrs = getChild(rootNode[i].id, nodes.children);
       rootNode[i].children = childArrs;
   }
   return rootNode;
 }

 function getChild(id, allNodes) {
   var childArr = [];

   if(allNodes){
      for(var i = 0; i < allNodes.length; i++) {
         if(id == allNodes[i].parentId) {
            childArr.push(allNodes[i]);
          }
        }
     }
        //递归
    for(var i = 0; i < childArr.length; i++) {
      var child = [];
       child = getChild(childArr[i].id, allNodes);
       childArr[i].children = child;
    }
    if(!childArr) {
      return null;
    }
    return childArr;
 }

原文地址:https://www.cnblogs.com/cnsdhzzl/p/11635654.html

时间: 2024-08-04 12:00:11

java递归、js递归,无限极分类菜单表的相关文章

js实现无限极分类

转载注明出处!!! 转载注明出处!!! 转载注明出处!!! 因为要实现部门通讯录,后台传来的数据是直接从数据库里拿的部门表,所以没有层级分类,只有parentId表示从属关系,所以分类的事情就交给我来做了. 不能说效率多高,只是说能实现了. 其实ACMer或者学过点算法和数据结构的应该知道这其实就是一个树,用数组存罢了,用数组存树的方法相信各位ACMer已经用的不要不要的了,所有并没有什么难度,知道思路就很好写了. 思路:获取到后台传来的数组dep,然后新建一个数组list,将dep遍历一遍,获

C#无限极分类树-创建-排序-读取 用Asp.Net Core+EF实现

今天做一个管理后台菜单,想着要用无限极分类,记得园子里还是什么地方见过这种写法,可今天找了半天也没找到,没办法静下心来自己写了: 首先创建节点类(我给它取名:AdminUserTree): 1 /// <summary> 2 /// 无限极节点类 3 /// </summary> 4 public class AdminUserTree 5 { 6 /// <summary> 7 /// 节点信息 8 /// </summary> 9 public int

php递归无限极分类

递归无限级分类有几种形式,我这里只举例比较常用的三种: 第一种:返回有排序的数组: <?php $data = array( 1 => array( 'id' => 1, 'pid' => 0, 'user_name' => 'one', ), 2 => array( 'id' => 2, 'pid' => 1, 'user_name' => 'two', ), 3 => array( 'id' => 3, 'pid' => 1, '

递归与无限极分类

在函数内部调用本身,且在调用时要做判断. 例:输出1~9 function deeploop(&$i=1){   //引用传值,防止递归时从1开始 echo  $i; $i++; if($i < 10){             //条件判断,防止无限递归 deeploop($i); } } 2.无限极分类原理:每次分类都需要记录它的父级id,如果是顶级,则父级id为0,通过父级id,一层一层往下查. 首先从数据库中取出结果集,把结果集中的pid与顶级的pid开始,然后确定顶级父级.依次往下

递归的一些应用(二)无限极分类

用递归的方法实现无限极分类 通常我在写项目的时候,在写一些例如商城分类的时候会实现对应分类的上级分类,或者其它项目部门管理的上级部门的时候一般就会用到无限极分类来进行分类 第一步:首先在数据表设计的时候,如果要实现无限极分类,一般我会在数据表多添加一个字段pid,下面我通过一张新建的数据表来说明一下, (1)建表: -- ---------------------------- -- Table structure for pid -- ----------------------------

PHP无限极分类的实现(不使用递归)

无限极分类在开发中经常使用,例如:部门结构.文章分类.无限极分类的难点在于“输出”和“查询”,例如 将文章分类输出为<ul>列表形式: 查找分类A下面所有分类包含的文章. 1.实现原理 在<无限级分类实现思路>一文中介绍了几种常见的实现方法,各有利弊.其中“改进前序遍历树”数据结构,便于输出和查询,但是在移动分类和常规理解上有些复杂. 2.数据结构 id fid title 1 0 中国 2 1 江苏 3 1 安徽 4 8 江阴 5 3 芜湖 6 3 合肥 7 3 蚌埠 8 2 无

用递归的方法实现无限极分类

通常我在写项目的时候,在写一些例如商城分类的时候会实现对应分类的上级分类,或者其它项目部门管理的上级部门的时候一般就会用到无限极分类来进行分类 第一步:首先在数据表设计的时候,如果要实现无限极分类,一般我会在数据表多添加一个字段pid,下面我通过一张新建的数据表来说明一下, (1)建表: -- ---------------------------- -- Table structure for pid -- ---------------------------- DROP TABLE IF

PHP实现无限极分类的两种方式,递归和引用

面试的时候被问到无限极分类的设计和实现,比较常见的做法是在建表的时候,增加一个PID字段用来区别自己所属的分类 $array = array( array('id' => 1, 'pid' => 0, 'name' => '河北省'), array('id' => 2, 'pid' => 0, 'name' => '北京市'), array('id' => 3, 'pid' => 1, 'name' => '邯郸市'), array('id' =>

php无限极分类以及递归(thinkphp)

php无限极分类: 无限极分类重点在于表的设计: 1在model中: class CatModel extends Model{ protected $cat = array(); public function __construct(){ parent::__construct(); $this->cats = $this->select(); } public function getTree($parent_id=0,$lev=0){ $tree = array(); foreach(