javascript - 递归循环数组

查看:86
本文介绍了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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆