zoukankan      html  css  js  c++  java
  • JS的有关递归的知识点(数据无限级联的实现)

    所用测试数据:

     1 const data = [
     2   {
     3     "area_id": 5,
     4     "name": "广东省",
     5     "parent_id": 0,
     6   }, 
     7   {
     8     "area_id": 6,
     9     "name": "广州市",
    10     "parent_id": 5,
    11   },
    12   {
    13     "area_id": 7,
    14     "name": "深圳市",
    15     "parent_id": 5,
    16   },
    17   {
    18     "area_id": 9,
    19     "name": "昌平区",
    20     "parent_id": 4,
    21   },
    22   {
    23     "area_id": 4,
    24     "name": "北京市",
    25     "parent_id": 3,
    26   },
    27   {
    28     "area_id": 3,
    29     "name": "北京",
    30     "parent_id": 0,
    31   },
    32   {
    33     "area_id": 2,
    34     "name": "测试子地区",
    35     "parent_id": 1,
    36   },
    37   {
    38     "area_id": 1,
    39     "name": "测试地区",
    40     "parent_id": 0,
    41   }
    42 ]
    View Code

    递归实现无限级数据:

     1 function toTreeData(data,pid){
     2   function tree(id) {
     3     let arr = []
     4     data.filter(item => {
     5       return item.parent_id === id;
     6     }).forEach(item => {
     7       arr.push({
     8         area_id: item.area_id,
     9         label: item.name,
    10         children: tree(item.area_id)
    11       })
    12     })
    13     return arr.length>0?arr:""
    14   }
    15   return tree(pid) // 第一级节点的父id,是null或者0,视情况传入
    16 }
    17 var tmp=toTreeData(data,0);
    18 console.log(tmp);
    View Code
    对象的方式实现无限级数据维护
     1 function setTreeData(arr) {
     2   // 删除所有 children,以防止多次调用
     3   arr.forEach(function (item) {
     4       delete item.children;
     5   });
     6   let map = {}; // 构建map
     7   arr.forEach(i => {
     8     map[i.area_id] = i; // 构建以area_id为键 当前数据为值
     9   });
    10 
    11   let treeData = [];
    12   arr.forEach(child => {
    13     const mapItem = map[child.parent_id]; // 判断当前数据的parent_id是否存在map中
    14 
    15     if (mapItem) { // 存在则表示当前数据不是最顶层数据
    16     
    17       // 注意: 这里的map中的数据是引用了arr的它的指向还是arr,当mapItem改变时arr也会改变,踩坑点
    18       (mapItem.children || ( mapItem.children = [] )).push(child); // 这里判断mapItem中是否存在children, 存在则插入当前数据, 不存在则赋值children为[]然后再插入当前数据
    19     } else { // 不存在则是组顶层数据
    20       treeData.push(child);
    21     }
    22   });
    23 
    24   return treeData;
    25 };
    View Code

    总结:递归其实遇到数据格式类似且嵌套的时候会使用到

  • 相关阅读:
    java集合
    struts2的OGNL表达式
    struts2 result type
    struts2在Action中访问WEB资源
    03异或^
    02自加自减运算机制
    原码,补码,反码
    Java基础50题test10—自由落体
    Java基础50题test9—求完数
    Java基础50题test8—输入数字求和
  • 原文地址:https://www.cnblogs.com/song-zmin/p/12808786.html
Copyright © 2011-2022 走看看