Js列表形式数据转换为树形结构数据以及反转

101 阅读1分钟

列表形式数据转换为树形结构数据

用递归将父节点id传递给下一层,直至list.parent与parent.id没有匹配项后结束递归返回,将子节点添加到父节点上

//列表形式数据展示
let data = [
    { id: '1', name: '广东省', parent: null },
    { id: '10', name: '深圳市', parent: '1' },
    { id: '11', name: '广州市', parent: '1' },
    { id: '100', name: '南山区', parent: '10' },
    { id: '101', name: '评山区', parent: '10' },
    { id: '1000', name: '粤海街道', parent: '100' }
]

//递归法
function listToTree(list, parentId = null) {
    return list.filter(item => item.parent === parentId).map(item => {
        let children = listToTree(list, item.id)
        if (children.length > 0) {
            return {
                ...item,
                children
            }
        } else {
            return {
                ...item
            }
        }
    })
}

转换后树形结构如图

image.png

将树形结构数据转换回列表形式

深度优先遍历,将子节点遍历完后再遍历叶子节点

//递归法
function TreetoList(tree, newArr = []) {
    tree.forEach(item => {
        const { children } = item
        if (children) {
            delete item.children
            if (children.length) {
                newArr.push(item)
                return TreetoList(children, newArr)
            }
        }
        newArr.push(item)
    })
    console.log(newArr)
    return newArr
}