递归循环数组

https://img1.mukewang.com/5bf1135900012e0c02490458.jpg

上面是后端返回一个数组给我,要拼接成一个树型菜单
规则是看nodeLevel是几级和parentId是在那个nodeId下的
像上面老板parentId为0的规表示最高级
黄经理和张经理的parentId为20则表示他是老板下面的因为老板的nodeId为20
不管有多少级以次这样递归到最后一层展现成下面这样一个结构,这种要怎么去递归??

data: [

    {

        value: '老板'

        children: [

            {

                value:'黄经理',

                    children: [

                        {value: '黄经理下属主管'}

                    ]

            },

            {

                value:'张经理',

                    children: [

                        {value: '张经理下属主管'}

                    ]

            },

        ]

    }

]


慕妹3146593
浏览 553回答 1
1回答

炎炎设计

大概写了一下,应该可以改改,有些特殊情况没考虑吧var value = [{&nbsp; &nbsp; "parentId": 0,&nbsp; &nbsp; "nodeId": 20,&nbsp; &nbsp; "nodeLevel": 1,&nbsp; &nbsp; "nodeName": "老板"}, {&nbsp; &nbsp; "parentId": 20,&nbsp; &nbsp; "nodeId": 30,&nbsp; &nbsp; "nodeLevel": 2,&nbsp; &nbsp; "nodeName": "黄经理"}, {&nbsp; &nbsp; "parentId": 20,&nbsp; &nbsp; "nodeId": 32,&nbsp; &nbsp; "nodeLevel": 2,&nbsp; &nbsp; "nodeName": "张经理"}, {&nbsp; &nbsp; "parentId": 30,&nbsp; &nbsp; "nodeId": 37,&nbsp; &nbsp; "nodeLevel": 3,&nbsp; &nbsp; "nodeName": "黄经理下属主管"}, {&nbsp; &nbsp; "parentId": 32,&nbsp; &nbsp; "nodeId": 56,&nbsp; &nbsp; "nodeLevel": 3,&nbsp; &nbsp; "nodeName": "张经理下属主管"}];var data = value.reduce(function(pre, cur) {&nbsp; &nbsp; pre = new Object(pre);&nbsp; &nbsp; cur = new Object(cur);&nbsp; &nbsp; return parse(pre, cur);});function parse(a, b) {&nbsp; &nbsp; if (a.parentId === b.nodeId) {&nbsp; &nbsp; &nbsp; &nbsp; if (b.children) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; b.children.push(a);&nbsp; &nbsp; &nbsp; &nbsp; } else {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; b.children = [a];&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; return b;&nbsp; &nbsp; } else if (b.parentId === a.nodeId) {&nbsp; &nbsp; &nbsp; &nbsp; if (a.children) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; a.children.push(b);&nbsp; &nbsp; &nbsp; &nbsp; } else {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; a.children = [b];&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; return a;&nbsp; &nbsp; } else {&nbsp; &nbsp; &nbsp; &nbsp; if (a.nodeLevel < b.nodeLevel && a.children) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for (let node of a.children) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; let r = parse(node, b);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (r) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; a.children.map(v=>{&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (v.nodeId === r.nodeId) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return r;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return v;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; );&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return a;&nbsp; &nbsp; &nbsp; &nbsp; } else if (a.nodeLevel > b.nodeLevel && b.children) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for (let node of b.children) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; let r = parse(node, a);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (r) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; b.children.map(v=>{&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (v.nodeId === r.nodeId) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return r;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return v;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; );&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return b;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }}function format(data) {&nbsp; &nbsp; if (!data) {&nbsp; &nbsp; &nbsp; &nbsp; return;&nbsp; &nbsp; }&nbsp; &nbsp; var r = {&nbsp; &nbsp; &nbsp; &nbsp; "value": data.nodeName&nbsp; &nbsp; };&nbsp; &nbsp; if (data.children) {&nbsp; &nbsp; &nbsp; &nbsp; r.children = [];&nbsp; &nbsp; &nbsp; &nbsp; for (let child of data.children) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; r.children.push(format(child));&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; return r;}data = format(data);console.log(JSON.stringify(data));
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript