递归将列表转换成树形结构、递归将树形结构转换成列表

1.递归将列表转换成树形结构(javascript)

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>


</head>

<body>
    <script>
        let dataList = [{
            label: '陕西省',
            index: 0,
            id: '陕西省0',
            pid: '',
            child: []
        }, {
            label: '西安市',
            index: 1,
            id: '西安市1',
            pid: '陕西省0',
            child: []
        }, {
            label: '雁塔区',
            index: 2,
            id: '雁塔区2',
            pid: '西安市1'
        }, {
            label: '碑林区',
            index: 2,
            id: '碑林区2',
            pid: '西安市1'
        }, {
            label: '山西省',
            index: 0,
            id: '山西省0',
            pid: '',
            child: []
        }, {
            label: '太原市',
            index: 1,
            id: '太原市1',
            pid: '山西省0',
            child: []
        }, {
            label: '尖草坪区',
            index: 2,
            id: '尖草坪区2',
            pid: '太原市1'
        }]

        // 递归将列表转换成树形结构
        function listToTreeData(list, rootValue) {
            var arr = []
            list.forEach(item => {
                if (item.pid === rootValue) {
                    const children = listToTreeData(list, item.id)
                    if (children.length) {
                        item.child = children
                    }
                    arr.push(item)
                }
            })
            return arr
        }
        let treeData = listToTreeData(dataList, '') // 调用方法
        console.log("treeData", treeData);
        let list = [{
                label: '陕西省',
                index: 0,
                id: '陕西省0',
                pid: '',
                child: [{
                    label: '西安市',
                    index: 1,
                    id: '西安市1',
                    pid: '陕西省0',
                    child: [{
                        label: '雁塔区',
                        index: 2,
                        id: '雁塔区2',
                        pid: '西安市1'
                    }, {
                        label: '碑林区',
                        index: 2,
                        id: '碑林区2',
                        pid: '西安市1'
                    }, ]
                }]
            }, {
                label: '山西省',
                index: 0,
                id: '山西省0',
                pid: '',
                child: [{
                    label: '太原市',
                    index: 1,
                    id: '太原市1',
                    pid: '山西省0',
                    child: [{
                        label: '尖草坪区',
                        index: 2,
                        id: '尖草坪区2',
                        pid: '太原市1'
                    }]
                }]
            }, ]

    </script>
</body>

</html>

2.递归将树形结构转换成列表

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        let list = [{
            label: '陕西省',
            index: 0,
            id: '陕西省0',
            pid: '',
            child: [{
                label: '西安市',
                index: 1,
                id: '西安市1',
                pid: '陕西省0',
                child: [{
                    label: '雁塔区',
                    index: 2,
                    id: '雁塔区2',
                    pid: '西安市1'
                }, {
                    label: '碑林区',
                    index: 2,
                    id: '碑林区2',
                    pid: '西安市1'
                }, ]
            }]
        }, {
            label: '山西省',
            index: 0,
            id: '山西省0',
            pid: '',
            child: [{
                label: '太原市',
                index: 1,
                id: '太原市1',
                pid: '山西省0',
                child: [{
                    label: '尖草坪区',
                    index: 2,
                    id: '尖草坪区2',
                    pid: '太原市1'
                }]
            }]
        }, ]

        function flatten(arr) {
            return [].concat(...arr.map(item => {
                if (item.child) {
                    let arr = [].concat(item, ...this.flatten(item.child));
                    delete item.child;
                    return arr;
                }
                return [].concat(item);
            }));
        }
        console.log('flatten', flatten(list))
        let origin = [{
            label: '陕西省',
            index: 0,
            id: '陕西省0',
            pid: ''
        }, {
            label: '西安市',
            index: 1,
            id: '西安市1',
            pid: '陕西省0'
        }, {
            label: '雁塔区',
            index: 2,
            id: '雁塔区2',
            pid: '西安市1'
        }, {
            label: '碑林区',
            index: 2,
            id: '碑林区2',
            pid: '西安市1'
        }, {
            label: '山西省',
            index: 0,
            id: '山西省0',
            pid: ''
        }, {
            label: '太原市',
            index: 1,
            id: '太原市1',
            pid: '山西省0'
        }, {
            label: '尖草坪区',
            index: 2,
            id: '尖草坪区2',
            pid: '太原市1'
        }]
    </script>
</body>

</html>
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐