树形结构数据
通过id值查找该元素
var data = [{id: 1, name: "办公管理", pid: 0,children: [{id: 2, name: "请假申请", pid: 1,children: [{id: 4, name: "请假记录", pid: 2}],},{id: 3, name: "出差申请", pid: 1}]},{id: 5, name: "系统设置", pid: 0,children: [{id: 6, name: "权限管理", pid: 5,children: [{id: 7, name: "用户角色", pid: 6},{id: 8, name: "菜单设置", pid: 6}]}]},];
方法一:递归
/** @desc:这种递归方式,是先从内深入去执行,先从第一个元素,不断解刨children去寻找,* 最后从最后一个开始向刚开始的方向去寻找*/function getChidlren(id) {let hasFound = false, // 表示是否有找到id值result = null;// 通过递归实现let fn = function (data) {if (Array.isArray(data) && !hasFound) { // 判断是否是数组并且没有的情况下,data.forEach(item => {if (item.id === id) { // 数据循环每个子项,并且判断子项下边是否有id值result = item; // 返回的结果等于每一项hasFound = true; // 并且找到id值} else if (item.children) {fn(item.children); // 递归调用下边的子项}})}}fn(data); // 调用一下return result;}console.log(getChidlren(3));
方法二:树状转扁平化(递归)、再利用find
/** @输入参数 list: 需要扁平化的树形结构数组,默认按children字段扁平展开* @输出:返回别扁平化的数组*/function platFn(list) {let res = []res = list.concat(...list.map(item => {if (item.children instanceof Array && item.children.length > 0) {return platFn(item.children)}return null}).filter(o => o instanceof Array && o.length > 0))return res}var platList= platFn(treeList)console.log(platList)/***@desc: find查找**/console.log('id: 32==>', platList.find(item => item.id == 32))
通过传入当前节点某个值(如id),查询所有父级节点
返回一个由上到下的数组列表
export function getParent(data2, nodeId2) {var arrRes = [];if (data2.length == 0) {if (!!nodeId2) {arrRes.unshift(data2)}return arrRes;}let rev = (data, nodeId) => {for (var i = 0, length = data.length; i < length; i++) {let node = data[i];if (node.id == nodeId) {arrRes.unshift(node)// 查找到当前id,继续追随父级idrev(data2, node.pid); // 注意这里是传入的tree,不要写成data了,不然遍历的时候一直都是node.children,不是从最顶层开始遍历的break;}else { // 如果当前节点没有对应id,则追溯该子类是否有匹配项if (!!node.children) {rev(node.children, nodeId);}}}return arrRes;};arrRes = rev(data2, nodeId2);return arrRes;}
调用时,传入数据和当前节点code(数据为树型结构)let newLevel = getParent(this.info, row.id)
通过递归json树根据子id查父id
//传入参数:需要遍历的json,需要匹配的idfindPnodeId(data,nodeId){//设置结果let result;if (!data) {return;//如果data传空,直接返回}for (var i = 0; i < data.children.length; i++) {let item = data.children[i];if (item.nodeId == nodeId) {result=data.nodeId;//找到id相等的则返回父idreturn result;} else if (item.children && item.children.length > 0) {//如果有子集,则把子集作为参数重新执行本方法result= findPnodeId(item, nodeId);//关键,千万不要直接return本方法,不然即使没有返回值也会将返回return,导致最外层循环中断,直接返回undefined,要有返回值才return才对if(result){return result;}}}//如果执行循环中都没有return,则在此returnreturn result;}
