问题描述

输入一串父子节点对的数组,利用其构造一颗树

输入

const arr = [
{id:1,parentid:null},
{id:2,parentid:1},
{id:3,parentid:1},
{id:4,parentid:2},
{id:5,parentid:3}
]

解决思路

  1. 明确输出的形式:

    type1: {id:0,chid:[{id,child},{id,child},{id,child}]}

    type2: 0:{1:{5:{}},2:{},3:{},4:{}}

    实践中type1更为实用,故选择之

  2. 每次只能处理一对父子关系,树形结构的核心是节点,也即处理两个节点。

    由于每个节点的状态是需要维护的,因此需要用一种结构存储每个节点并更新之,最后程序只需要找到根节点是谁即可输出完整的属性结构;

解决代码

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生成一棵树的更多相关文章

  1. [WebKit内核] JavaScript引擎深度解析--基础篇(一)字节码生成及语法树的构建详情分析

    [WebKit内核] JavaScript引擎深度解析--基础篇(一)字节码生成及语法树的构建详情分析 标签: webkit内核JavaScriptCore 2015-03-26 23:26 2285 ...

  2. 用dTree组件生成无限级导航树

     在做管理系统时不可避免要用到导航树,这种东西只要一次做好,就可以随处运行,目前比较好的组件是dTree,原则上可以达到无限级,当然实际运行中4,5级就已经很多了,dTree的速度还是不错的,而且是J ...

  3. javascript实现数据结构: 树和森林

    树的3种常用链表结构 1 双亲表示法(顺序存储结构) 优点:parent(tree, x)操作可以在常量时间内实现 缺点:求结点的孩子时需要遍历整个结构 用一组连续的存储空间来存储树的结点,同时在每个 ...

  4. javascript实现数据结构: 树和二叉树的应用--最优二叉树(赫夫曼树),回溯法与树的遍历--求集合幂集及八皇后问题

    赫夫曼树及其应用 赫夫曼(Huffman)树又称最优树,是一类带权路径长度最短的树,有着广泛的应用. 最优二叉树(Huffman树) 1 基本概念 ① 结点路径:从树中一个结点到另一个结点的之间的分支 ...

  5. js实现一棵树的生长

    参考链接:https://blog.csdn.net/u010298576/article/details/76609244 HTML网页源码: 1 <!DOCTYPE html> 2 & ...

  6. 使用javascript生成的植物显示过程特效

    查看效果:http://keleyi.com/keleyi/phtml/html5/33.htm .NET版本:http://keleyi.com/a/bjac/66mql4bc.htm 完整HTML ...

  7. LeetCode——Same Tree(判断两棵树是否相同)

    问题: Given two binary trees, write a function to check if they are equal or not. Two binary trees are ...

  8. 【原创】网站抓包HttpWebRequest不返回Javascript生成的Cookie的解决办法

    前言: 最近在做中国移动爬虫的过程中,首先遇到的就是 在某个请求中,有一个名为“WT_PFC"的cookie键值是由前端JavaScript生成的,没有进入到HttpWebResponse中 ...

  9. 小希的迷宫(MST单棵树判断法则)

    小希的迷宫 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

随机推荐

  1. Java8 HashMap扩容时为什么不需要重新hash

    技巧: 与&操作   和   与 n 如8 与,为0  则位置不变 https://blog.csdn.net/zlp1992/article/details/104376309 java8在 ...

  2. Mybatis mapper文件占位符设置默认值

    如果要设置占位符默认值的话:需要进行 设置 org.apache.ibatis.parsing.PropertyParser.enable-default-value 属性为true启用占位符默认值处 ...

  3. Spring Cloud第一次请求报错问题

    一.原因 我们在使用Spring Cloud的Ribbon或Feign来实现服务调用的时候,第一次请求经常会经常发生超时报错,而之后的调用就没有问题了.造成第一次服务调用出现失败的原因主要是Ribbo ...

  4. 一个 Spring 的应用看起来象什么?

    一个定义了一些功能的接口.这实现包括属性,它的 Setter , getter 方法和函数等.Spring AOP.Spring 的 XML 配置文件.使用以上功能的客户端程序.

  5. jsp技术之隐藏域

    隐藏域 hidden:隐藏域属性,不显示到页面上,但是会提交的表单项 注意:表单中增加了一个隐藏域,是用户的id.稍后修改联系人信息,提交表单时需要使用到 <!-- hidden:隐藏域,不显示 ...

  6. 块级格式化上下文(BFC)

    一.什么是BFC 具有BFC属性的元素也属于普通流定位方式,与普通容器没有什么区别,但是在功能上,具有BFC的元素可以看做是隔离了的独立容器,容器里面的元素不会在布局上影响到外面的元素,并且具有普通容 ...

  7. [译]HTML&CSS Lesson5: 定位

    CSS最大的用处之一就是可以将内容和元素定位到任何我们想要的位置,使我们的设计具有结构,使内容更加易懂. CSS有好几种不同的定位属性,每种都有自己的使用场景.在这节课中我们会通过不同的案例--可复用 ...

  8. python爬取京东评论

    一.分析 1.找到京东商品评论所在位置(记得点击商品评论,否则找不到productPageComments.action)  2.解析文件 打开后发现是json数据,但不是那么规范,所以需要去点前面的 ...

  9. 【Android Studio】Gradle统一管理版本号引用配置

    1.在根目录下的build.gradle文件下添加 ext{ .... } 中的内容 ...... // Define versions in a single place ext { // SDK ...

  10. 安卓电池健康查看软件AccuBattery 分享

    一.天下苦秦久矣 说实话,我是小米的忠实粉丝(雷总打钱),手里目前是红米k30pro标准版, 室友中有用华为也有苹果的,据我所知苹果系统是可以看到电池健康的,但是安卓却不行, 所以推荐大家一个安卓软件 ...