树形结构数据
通过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,继续追随父级id
rev(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,需要匹配的id
findPnodeId(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相等的则返回父id
return result;
} else if (item.children && item.children.length > 0) {
//如果有子集,则把子集作为参数重新执行本方法
result= findPnodeId(item, nodeId);
//关键,千万不要直接return本方法,不然即使没有返回值也会将返回return,导致最外层循环中断,直接返回undefined,要有返回值才return才对
if(result){
return result;
}
}
}
//如果执行循环中都没有return,则在此return
return result;
}