javascript生成一棵树
问题描述
输入一串父子节点对的数组,利用其构造一颗树
输入
const arr = [
{id:1,parentid:null},
{id:2,parentid:1},
{id:3,parentid:1},
{id:4,parentid:2},
{id:5,parentid:3}
]
解决思路
明确输出的形式:
type1: {id:0,chid:[{id,child},{id,child},{id,child}]}
type2: 0:{1:{5:{}},2:{},3:{},4:{}}
实践中type1更为实用,故选择之
每次只能处理一对父子关系,树形结构的核心是节点,也即处理两个节点。
由于每个节点的状态是需要维护的,因此需要用一种结构存储每个节点并更新之,最后程序只需要找到根节点是谁即可输出完整的属性结构;
解决代码
const arr = [
{id:1,parentid:null},
{id:2,parentid:1},
{id:3,parentid:1},
{id:4,parentid:2},
{id:5,parentid:3}
]
function generateTree(srcList){
// 1. 明确输出的形式:
// type1:{id:0,chid:[{id,child},{id,child},{id,child}]}
// type2: 0:{1:{5:{}},2:{},3:{},4:{}}
// 实践中type1更为实用,故选择之
// 2. 每次只能处理一对父子关系,树形结构的核心是节点,也即处理两个节点。
// 由于每个节点的状态是需要维护的,因此需要用一种结构存储每个节点并更新之,最后程序只需要找到根节点是谁即可输出完整的属性结构;
let nodeRigister = {}
let root = undefined
srcList.forEach(element => {
let childId = element.id
let parentId = element.parentid
// parentId可能引入新的信息:判断是否为根节点。需要特判之
if(!parentId){
root = childId
}
// 处理儿子节点
if(!(childId in Object.keys(nodeRigister))){
nodeRigister[childId] = {id:childId,child:[]}
}
// 处理父节点
if(parentId && parentId in Object.keys(nodeRigister)){
nodeRigister[parentId].child.push(nodeRigister[childId])
}else if(parentId){
nodeRigister[parentId] = {id:parentId,child:[nodeRigister[childId]]}
}
});
return nodeRigister[root]
}
console.log(JSON.stringify(generateTree(arr)))
javascript生成一棵树的更多相关文章
- [WebKit内核] JavaScript引擎深度解析--基础篇(一)字节码生成及语法树的构建详情分析
[WebKit内核] JavaScript引擎深度解析--基础篇(一)字节码生成及语法树的构建详情分析 标签: webkit内核JavaScriptCore 2015-03-26 23:26 2285 ...
- 用dTree组件生成无限级导航树
在做管理系统时不可避免要用到导航树,这种东西只要一次做好,就可以随处运行,目前比较好的组件是dTree,原则上可以达到无限级,当然实际运行中4,5级就已经很多了,dTree的速度还是不错的,而且是J ...
- javascript实现数据结构: 树和森林
树的3种常用链表结构 1 双亲表示法(顺序存储结构) 优点:parent(tree, x)操作可以在常量时间内实现 缺点:求结点的孩子时需要遍历整个结构 用一组连续的存储空间来存储树的结点,同时在每个 ...
- javascript实现数据结构: 树和二叉树的应用--最优二叉树(赫夫曼树),回溯法与树的遍历--求集合幂集及八皇后问题
赫夫曼树及其应用 赫夫曼(Huffman)树又称最优树,是一类带权路径长度最短的树,有着广泛的应用. 最优二叉树(Huffman树) 1 基本概念 ① 结点路径:从树中一个结点到另一个结点的之间的分支 ...
- js实现一棵树的生长
参考链接:https://blog.csdn.net/u010298576/article/details/76609244 HTML网页源码: 1 <!DOCTYPE html> 2 & ...
- 使用javascript生成的植物显示过程特效
查看效果:http://keleyi.com/keleyi/phtml/html5/33.htm .NET版本:http://keleyi.com/a/bjac/66mql4bc.htm 完整HTML ...
- LeetCode——Same Tree(判断两棵树是否相同)
问题: Given two binary trees, write a function to check if they are equal or not. Two binary trees are ...
- 【原创】网站抓包HttpWebRequest不返回Javascript生成的Cookie的解决办法
前言: 最近在做中国移动爬虫的过程中,首先遇到的就是 在某个请求中,有一个名为“WT_PFC"的cookie键值是由前端JavaScript生成的,没有进入到HttpWebResponse中 ...
- 小希的迷宫(MST单棵树判断法则)
小希的迷宫 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submi ...
随机推荐
- 一台 Linux 系统初始化环境后需要做一些什么安全工作?
1.添加普通用户登陆,禁止 root 用户登陆,更改 SSH 端口号. 修改 SSH 端口不一定绝对哈.当然,如果要暴露在外网,建议改下.l 2.服务器使用密钥登陆,禁止密码登陆. ...
- Java程序要操作数据库,一定要使用JDBC技术吗?
<!-- MySQL驱动,连接数据库用,由数据库厂商提供 --> <dependency> <groupId>mysql</groupId> <a ...
- 用 Java 写一个单例类?
饿汉式单例 public class Singleton { private Singleton(){} private static Singleton instance = new Singlet ...
- Java堆空间的划分:新生代、老年代
参考链接:Java堆空间的划分:新生代.老年代
- MariaDB CTE公用表达式
公用表达式(Common Table Expressions,简称CTE) Maria DB 版本为10.2.2以上的才支持 WITH 语法 CTE 介绍 WITH关键字表示公用表表达式(CTE) 它 ...
- 在java web工程中实现登入和安全验证
登入页面的话我们之前做过直接可以拿来用翻一翻之前的博客就可以找到 在这个基础上添加验证功能 代码如下: 1 package security; 2 /** 3 * @author 鐜嬭儨鍗? 4 */ ...
- APScheduler定时任务框架
1.简介 APScheduler是一个Python**定时任务框架**,提供了**基于日期**.**固定时间间隔**以及**crontab**类型的任务,并且可以**持久化任务**.基于这些功能,我们 ...
- mysql8.0时区问题
今天在mysql新增一条数据的时候,发现时间类型的字段比起现在少了8个小时,查了资料才发现,这个是MySQL8.0出现的问题,讲下解决方法. 1.在java项目中application.yml文件中的 ...
- Numpy怎样给数组增加一个维度
Numpy怎样给数组增加一个维度 背景:很多数据计算都是二维或三维的,对于一维的数据输入为了形状匹配,经常需升维变成二维 需要:在不改变数据的情况下,添加数组维度:(注意观察这个例子,维度变了,但数据 ...
- Python使用递归绘制谢尔宾斯基三角形
谢尔宾斯基三角形使用了三路递归算法,从一个大三角形开始,通过连接每一个边的中点,将大三角型分为四个三角形,然后忽略中间的三角形,依次对其余三个三角形执行上述操作. 运行效果: 源代码: 1 impor ...