javascript - 递归循环数组
本文介绍了javascript - 递归循环数组的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
问 题
value:[
{
"parentId":0,
"nodeId":20,
"nodeLevel":1,
"nodeName":"老板"
},{
"parentId":20,
"nodeId":30,
"nodeLevel":2,
"nodeName":"黄经理"
},{
"parentId":20,
"nodeId":32,
"nodeLevel":2,
"nodeName":"张经理"
},{
"parentId":30,
"nodeId":37,
"nodeLevel":3,
"nodeName":"黄经理下属主管"
},{
"parentId":32,
"nodeId":56,
"nodeLevel":3,
"nodeName":"张经理下属主管"
}
]
上面是后端返回一个数组给我,要拼接成一个树型菜单
规则是看nodeLevel
是几级和parentId
是在那个nodeId
下的
像上面老板parentId为0的规表示最高级
黄经理和张经理的parentId为20则表示他是老板下面的因为老板的nodeId为20
不管有多少级以次这样递归到最后一层展现成下面这样一个结构,这种要怎么去递归??
data: [
{
value: '老板'
children: [
{
value:'黄经理',
children: [
{value: '黄经理下属主管'}
]
},
{
value:'张经理',
children: [
{value: '张经理下属主管'}
]
},
]
}
]
解决方案
大概写了一下,应该可以改改,有些特殊情况没考虑吧
var value = [{
"parentId": 0,
"nodeId": 20,
"nodeLevel": 1,
"nodeName": "老板"
}, {
"parentId": 20,
"nodeId": 30,
"nodeLevel": 2,
"nodeName": "黄经理"
}, {
"parentId": 20,
"nodeId": 32,
"nodeLevel": 2,
"nodeName": "张经理"
}, {
"parentId": 30,
"nodeId": 37,
"nodeLevel": 3,
"nodeName": "黄经理下属主管"
}, {
"parentId": 32,
"nodeId": 56,
"nodeLevel": 3,
"nodeName": "张经理下属主管"
}];
var data = value.reduce(function(pre, cur) {
pre = new Object(pre);
cur = new Object(cur);
return parse(pre, cur);
});
function parse(a, b) {
if (a.parentId === b.nodeId) {
if (b.children) {
b.children.push(a);
} else {
b.children = [a];
}
return b;
} else if (b.parentId === a.nodeId) {
if (a.children) {
a.children.push(b);
} else {
a.children = [b];
}
return a;
} else {
if (a.nodeLevel < b.nodeLevel && a.children) {
for (let node of a.children) {
let r = parse(node, b);
if (r) {
a.children.map(v=>{
if (v.nodeId === r.nodeId) {
return r;
}
return v;
}
);
}
}
return a;
} else if (a.nodeLevel > b.nodeLevel && b.children) {
for (let node of b.children) {
let r = parse(node, a);
if (r) {
b.children.map(v=>{
if (v.nodeId === r.nodeId) {
return r;
}
return v;
}
);
}
}
return b;
}
}
}
function format(data) {
if (!data) {
return;
}
var r = {
"value": data.nodeName
};
if (data.children) {
r.children = [];
for (let child of data.children) {
r.children.push(format(child));
}
}
return r;
}
data = format(data);
console.log(JSON.stringify(data));
这篇关于javascript - 递归循环数组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文