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 ]
递归实现无限级数据:
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);
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 };
总结:递归其实遇到数据格式类似且嵌套的时候会使用到
JS的有关递归的知识点(数据无限级联的实现)的更多相关文章
- JS实现-页面数据无限加载
在手机端浏览网页时,经常使用一个功能,当我们浏览京东或者淘宝时,页面滑动到底部,我们看到数据自动加载到列表.之前并不知道这些功能是怎么实现的,于是自己在PC浏览器上模拟实现这样的功能.先看看浏览效果: ...
- 【整理】iview Tree数据格式问题,无限递归树处理数据
iview Tree数据格式问题,无限递归树处理数据 https://juejin.im/post/5b51a8a4e51d455d6825be20
- Python--递归函数实现:多维嵌套字典数据无限遍历
原创:多层嵌套字典无限遍历,实现当value值以特殊字符$开头,并且等于某项值时,用随机函数替换该参数 """处理前的字典{'patient': {'avatarPic' ...
- chart.js插件生成折线图时数据普遍较大时Y轴数据不从0开始的解决办法[bubuko.com]
chart.js插件生成折线图时数据普遍较大时Y轴数据不从0开始的解决办法,原文:http://bubuko.com/infodetail-328671.html 默认情况下如下图 Y轴并不是从0开始 ...
- <经验杂谈>介绍Js简单的递归排列组合
最近在开发SKU模块的时候,遇到这样一个需求,某种商品有N(用未知数N来表示是因为规格的数组由用户制定且随时可以编辑的,所以对程序来说,它是一个未知数)类规格,每一类规格又有M个规格值,各种规格值的组 ...
- js模拟form表单提交数据, js模拟a标签点击跳转,避开使用window.open引起来的浏览器阻止问题
js模拟form表单提交数据, js模拟a标签点击跳转,避开使用window.open引起来的浏览器阻止问题 js模拟form表单提交数据源码: /** * js模拟form表单提交 * @param ...
- 关于js渲染网页时爬取数据的思路和全过程(附源码)
于js渲染网页时爬取数据的思路 首先可以先去用requests库访问url来测试一下能不能拿到数据,如果能拿到那么就是一个普通的网页,如果出现403类的错误代码可以在requests.get()方法里 ...
- [转]JS判断字符串是否为json数据
原文地址:https://blog.csdn.net/qq_26400953/article/details/77411520 这周碰到了很多问题,尽量把遇到的问题都记录下来. JS判断字符串是否为j ...
- Atitit 项目界面h5化静态html化计划---vue.js 把ajax获取到的数据 绑定到表格控件 v2 r33.docx
Atitit 项目界面h5化静态html化计划---vue.js 把ajax获取到的数据 绑定到表格控件 v2 r33.docx 1. 场景:应用在项目列表查询场景下1 1.1. 预计初步掌握vue ...
- js怎样得出数组中某个数据最大连续出现的次数
1:js怎样得出数组中某个数据最大连续出现的次数 var test=[1,2,3,3,2,2,2,3,3,3,3,5,3,3,3,3,3] ; var j = 0 ; var max ...
随机推荐
- 第五篇:前端之JQuery
jQuery快速入门 jQuery jQuery介绍 jQuery是一个轻量级的.兼容多浏览器的JavaScript库. jQuery使用户能够更方便地处理HTML Document.Events ...
- Redis 如何批量设置过期时间?PIPLINE的使用
合理的使用缓存策略对开发同学来讲,就好像孙悟空习得自在极意功一般~ 抛出问题 Redis如何批量设置过期时间呢? 不要说在foreach中通过set()函数批量设置过期时间 给出方案 我们引入redi ...
- [数据分析与可视化] 数据绘图要点2-Y轴的开始与结束
数据绘图要点2-Y轴的开始与结束 切割或不切割Y轴可能是数据可视化中最具争议的话题之一.基本上,主要问题在于 Y 轴是否应始终从零开始.数据可视化的目的是讲述一个故事,图形表达方式会对可视化讲述的故事 ...
- [OpenCV实战]15 基于深度学习的目标跟踪算法GOTURN
目录 1 什么是对象跟踪和GOTURN 2 在OpenCV中使用GOTURN 3 GOTURN优缺点 4 参考 在这篇文章中,我们将学习一种基于深度学习的目标跟踪算法GOTURN.GOTURN在Caf ...
- (二)elasticsearch 源码目录
在阅读源码之前,我们先来看看整个项目的结构:(同(一)elasticsearch 编译和启动,我们使用版本7.4.0作为示例) .ci,持续集成配置 .github, 里面有 PULL_REQUEST ...
- [Untiy]贪吃蛇大作战(五)——游戏主界面
接着上一节: 4.AI蛇的设计 这里AI蛇大部分代码都可以参照主角的代码,我这里的实现其实还可以进行改进.基本原理就是蛇创建之后给蛇一个随机方向的单位向量,AI蛇的蛇头添加一个比蛇头大两三倍大小的碰撞 ...
- CF896E Welcome home, Chtholly
题面 维护一个\(n(n\leqslant 100000)\)个元素序列\(a_1,a_2,\dots,a_n\),有\(m(m\leqslant 100000)\)次操作,分为如下两种. 给定\(l ...
- Redis--回顾提要
一.写在前 知识学了就忘!不用就忘!我太健忘!特此记录!用于复习打卡!Redis干就完事了! 二.来辣! Redis做异步队列:一般list结构做队列,rpush生产消息,lpop消费消息,当lpop ...
- Ubuntu snap 下载慢
解决方法 sudo apt-get install snapd sudo snap install snap-store sudo snap install snap-store-proxy sudo ...
- 重磅!瞄准 Web 3.0,谷歌云推出专为区块链服务的 Blockchain Node Engine!
[本文由Cloud Ace整理发布,谷歌云服务请访问Cloud Ace 官网] 区块链技术正在为世界各地的消费者和企业带来巨大的创新和价值创造.随着技术变得越来越主流,公司需要可扩展.安全和可持续的基 ...