为了账号安全,请及时绑定邮箱和手机立即绑定

递归循环数组

递归循环数组

慕妹3146593 2018-10-17 15:30:41
上面是后端返回一个数组给我,要拼接成一个树型菜单规则是看nodeLevel是几级和parentId是在那个nodeId下的像上面老板parentId为0的规表示最高级黄经理和张经理的parentId为20则表示他是老板下面的因为老板的nodeId为20不管有多少级以次这样递归到最后一层展现成下面这样一个结构,这种要怎么去递归??data: [    {        value: '老板'        children: [            {                value:'黄经理',                    children: [                        {value: '黄经理下属主管'}                    ]            },            {                value:'张经理',                    children: [                        {value: '张经理下属主管'}                    ]            },        ]    }]
查看完整描述

1 回答

?
炎炎设计

TA贡献1808条经验 获得超4个赞

大概写了一下,应该可以改改,有些特殊情况没考虑吧


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));



查看完整回答
反对 回复 2018-11-18
  • 1 回答
  • 0 关注
  • 552 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号