简介:日常业务中可能遇到需要对树形结构进行查询、展平成数组,将数组转换成树形结构等操作。
假设有一个树形结构数据如下
var tree=[ { 'id': '1', 'name': '教学素材管理', 'children':[ { 'id': '101', 'name': '教学素材', 'children':[ { 'id': '10101', 'name': '修改', }, { 'id': '10102', 'name': '添加', } ] }, { 'id': '102', 'name': '测试试题', }, { 'id': '103', 'name': '问题任务', } ] }, { 'id': '2', 'name': '基础数据管理', 'children':[ { 'id': '201', 'name': '专业设置', }, { 'id': '202', 'name': '专业管理', } ] } ]
1、如何在tree中找到id=10102的对象?
思路一:(递归)深度遍历,从顶点开始,当前节点有子节点则遍历当前节点的子节点。
function deepQuery(tree,id) { var isGet = false; var retNode = null; function deepSearch(tree,id){ for(var i = 0; i<tree.length; i++) { if(tree[i].children && tree[i].children.length>0) { deepSearch(tree[i].children,id); } if(id === tree[i].id || isGet) { isGet||(retNode = tree[i]); isGet = true; break; } } } deepSearch(tree,id); return retNode; }
var getNode = deepQuery(tree,10102); console.log(getNode)
思路二:广度遍历,遍历根节点的所有子节点,再从第一个子节点开始依次遍历。
function breadthQuery(tree, id) { var stark = []; stark = stark.concat(tree); while(stark.length) { var temp = stark.shift(); if(temp.children) { stark = stark.concat(temp.children); } if(temp.id === id) { return temp; } } }
var getNode=breadthQuery(tree,10102); console.log(getNode);
2、如何将树形结构转换为有父子关系属性的数组结构?
思路一:初始化一个空数组,从tree的顶端开始遍历,当前节点有子节点时,一边继续遍历子节点,一边在当前节点上删除子节点,将当前节点push到空数组。
function spread(menus,pid) { for (var i=0; i < menus.length; i++ ) { menu = menus[i] if (menu.children) { spread(menu.children,menu.id) delete menu.children } menu.pid=pid; menuArr.push(menu) } } let menuArr = [] spread(menus) console.info(menuArr)
结果:
 ̄□ ̄||结果有点不尽人意,有空再修改
思路二:
function flatten (data) { return data.reduce((arr, {Id, Name, Pid, id, children = []}) => arr.concat([{Id, Name, Pid, id}], flatten(children)), []) }
3、如何将数组结构转换为树形结构?