博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
线性结构与树形结构相互转换(ES6实现)
阅读量:6877 次
发布时间:2019-06-26

本文共 1818 字,大约阅读时间需要 6 分钟。

前言

  当树形结构的层级越来越深时,操作某一节点会变得越来越费劲,维护成本不断增加。所以线性结构与树形的相互转换变得异常重要!

  首先,我们约定树形结构如下:

node = {  id: number,  // 数值   parentId: number,  // 数值  name: string,   children: [] || null,  // 用数组的方式保存子节点,适合更多业务场景  }

   线性结构:

list = [   { id: number, parentId: number, name: string },    { id: number, parentId: number, name: string },];

特殊情况  

  上面的树形结构并不是很完美,当遇到菜单或者分类等业务场景时,每个顶级节点的parentId约定为0,当存在多个顶级节点,显得不是一个完整的树。所以在这类特殊情况下,我们需要构造一个顶级节点。将菜单或者分类的原有顶级节点存储至该节点的children中。 所以最后约定顶级节点如下。

root = null || {  id: 0,  parentId: null,  children: [node1, node2, ...],  }

线性结构与树形结构相互转换

  线性转树形:

function listConvertTree(list) {  let root = null;  if (list && list.length) {    root = { id: 0, parentId: null, children: [] };    const group = {};    for (let index = 0; index < list.length; index += 1) {      if (list[index].parentId !== null && list[index].parentId !== undefined) {        if (!group[list[index].parentId]) {          group[list[index].parentId] = [];        }        group[list[index].parentId].push(list[index]);      }    }    const queue = [];    queue.push(root);    while (queue.length) {      const node = queue.shift();      node.children = group[node.id] && group[node.id].length ? group[node.id] : null;      if (node.children) {        queue.push(...node.children);      }    }  }  return root;}

  树形转线性:

function treeConvertList(root) {  const list = [];  if (root) {    const Root = JSON.parse(JSON.stringify(root));    const queue = [];    queue.push(Root);    while (queue.length) {      const node = queue.shift();      if (node.children && node.children.length) {        queue.push(...node.children);      }      delete node.children;      if (node.parentId !== null && node.parentId !== undefined) {        list.push(node);      }    }  }  return list;}

转载于:https://www.cnblogs.com/raion/p/8906319.html

你可能感兴趣的文章
Jquery 遍历 Table;遍历CheckBox ;遍历Select;全选/全不选
查看>>
day14 内置函数二
查看>>
Sequelize-nodejs-2-basic usage
查看>>
XVI Open Cup named after E.V. Pankratiev. GP of Ekaterinburg.
查看>>
iOS-中app启动闪退的原因
查看>>
iOS--高级技术
查看>>
入门·开始使用机器学习
查看>>
【备忘】oc 调用 swift
查看>>
screen命令总结
查看>>
struct内存对齐
查看>>
套接字基础
查看>>
【转】配置Editplus调试PHP程序入门教程
查看>>
iphone-common-codes-ccteam源代码 CCKeyboard.h
查看>>
Javascript中的原型prototype
查看>>
个人随想:对于一个.Neter来说,如果一直想走技术路线,该怎么走下去
查看>>
深浅拷贝
查看>>
Mysql 解锁处理
查看>>
源码来袭!!!基于jquery的ajax分页插件(demo+源码)
查看>>
JDBC的基本用法
查看>>
二分查找的递归和非递归实现
查看>>