JS的有关递归的知识点(数据无限级联的实现)

Posted 不靠谱设计

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

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

以上是关于JS的有关递归的知识点(数据无限级联的实现)的主要内容,如果未能解决你的问题,请参考以下文章

请问checkbox如何产生级联的(全选,反选,不选)代码是啥样子的?

请问用啥方式可以实现省市级联的效果呀 省市的数据是从数据库中查出来的

Mybatis + mysql 实现两级级联的查询

javascript制作图javascript制作图片无限懒加载,轻松又实用片无限懒加载,轻松又实用

JS数组递归——构建 element 级联选择器树形数据

mybatis 级联