树形数据结构的实现

1、已知数据结构

let data = [
 "/members/成员/垂直研发中心/营销云",
 "/members/成员/汽车事业部",
 "/members/成员/营销能力中心/分析咨询部",
 "/members/成员/平台研发中心/国双云",
 "/members/成员/平台研发中心/信息云",
 "/members/成员/运营管理部/信息化部",
 "/members/成员/消费品事业部",
 "/members/成员/技术共享中心/产品应用与研究部",
 "/members/成员/平台研发中心/数据智能云",
 "/members/成员/航旅事业部",
]

2、期望转变成树形数据结构

let o = {
    label:'members',
    children:[{
        label:'成员',
        children:[{
            label:'垂直研发中心',
            children:[{
                label:'营销云'
            }]
        },{
            label:'汽车事业部'
        },{
            label:'营销能力中心',
             children:[{
                label:'分析咨询部'
            }]
        }]
    }
    ...
    ]

}
阅读 3.3k
2 个回答

其实不复杂,给一个通用点的吧,传入数组,传出也是数组。

function listToTree (srcList) {
  let destList = []
  srcList.forEach(path => {
    let pathList = path.split('/')
    pathList = pathList.slice(1)
    let levelList = destList
    for (let label of pathList) {
      let obj = levelList.find(item => item.label == label)
      if (!obj) {
        obj = { label, children: [] }
        levelList.push(obj)
      }
      levelList = obj.children
    }
  })
  return destList
}

console.log(listToTree(data))

比如传入

[
  '/a/b',
  '/a/c',
  '/b/c'
]

解析为

[
 {
  label: 'a',
  children: [
    {
      label: 'b',
      children: []
    },
    {
      label: 'c',
      children: []
    }
  ]
 },
 {
  label: 'b',
  children: []
 }
]

我之前写过这个类似的题目,这个只要找到父子关系即可。一个参考的解答,可能有更好的做法?

function Node (label, children=[]) {
    this.label = label;
    this.children = children;
}

function getTree (data) {
    let nodes = {}, edges = {}, root;
    data.forEach(function(line, index) {
        let labels = line.split('/').filter(val=>val!=='');
        //找到根结点
        root = labels[0]
        for(let i = 0; i < labels.length; i++) {
            //找到所有节点
            nodes[labels[i]] = new Node(labels[i])
            //找到所有父子关系
            if(i < labels.length - 1) {
                edges[labels[i]]
                ? edges[labels[i]].add(labels[i+1])
                : edges[labels[i]] = new Set([labels[i+1]])
            }
        }
    })
    for(let key in edges) {
        edges[key].forEach( function(element, index) {
            nodes[key].children.push(nodes[element])
        });
    }
    return nodes[root]
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题