js树形数据,获取所有的路径

有如下树形数据:

[
    {
        "label":"节点1",
        "value":"值1",
        "level":1,
        "children":[
            {
                "label":"节点1-1",
                "value":"值1-1",
                "level":2,
                "children":[
                    {
                        "label":"节点1-1-1",
                        "value":"1-1-1",
                        "level":3
                    },
                    {
                        "label":"节点1-1-2",
                        "value":"1-1-2",
                        "level":3
                    }
                ]
            }
        ]
    },
    {
        "label":"节点2",
        "value":"值2",
        "level":1,
        "children":[
            {
                "label":"节点2-1",
                "value":"值2-1",
                "level":2,
                "children":[
                    {
                        "label":"节点2-1-1",
                        "value":"2-1-1",
                        "level":3
                    }
                ]
            }
        ]
    }
]

获取所有的路径并转换字段名成:

[
    {
        "oneId":"值1",
        "oneName":"节点1",
        "twoId":"值1-1",
        "twoName":"节点1-1",
        "treeId":"值1-1-1",
        "treeName":"节点1-1-1"
    },
    {
        "oneId":"值1",
        "oneName":"节点1",
        "twoId":"值1-1",
        "twoName":"节点1-1",
        "treeId":"值1-1-2",
        "treeName":"节点1-1-2"
    },
    {
        "oneId":"值2",
        "oneName":"节点2",
        "twoId":"值2-1",
        "twoName":"节点2-1",
        "treeId":"值2-1-1",
        "treeName":"节点2-1-1"
    }
]

请问如何操作?

阅读 3.7k
2 个回答

不确定是不是层级固定,所以还是按照层级不固定来吧

function treeFlat(tree, parent = {}, list = []) {
    const num2enMap = {
        1: 'one',
        2: 'two',
        3: 'three',
        4: 'four',
        5: 'five',
        6: 'six',
        7: 'seven',
        8: 'eight',
        9: 'nine',
    }
    function num2en(num) {
        return num2enMap[num] || 'unknown';
    }
    const queue = tree.concat()
    while (queue.length) {
        const node = queue.shift()
        const levelEn = num2en(node.level)
        const newNode = {
            [`${levelEn}Name`]: node.label,
            [`${levelEn}Id`]: node.value,
        }
        const newParent = Object.assign({}, parent, newNode)
        if (!node.children || !node.children.length) {
            list.push(newParent)
        } else {
            treeFlat(node.children, newParent, list)
        }
    }
    return list;
}

比较好理解的路径搜索算法;

const getAllPath = (tree) => {
    const paths = [], stack = tree.map(n => ([n, []]));
    while (stack.length) {
        const t = stack.pop();
        t[1].push(t[0]);
        if (!t[0].children) {
            paths.push([...t[1]]);
            t[1].pop();
            continue;
        }
        t[0].children.forEach(cn => stack.push([cn, t[1]]))
    }
    return paths.map(p => ({
        "oneId": p[0].value,
        "oneName": p[0].label,
        "twoId": p[1].value,
        "twoName": p[1].label,
        "treeId": p[2].value,
        "treeName": p[2].label
    }));
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题