(JS) 将对象数组转换为嵌套对象数组的路径

时间:2021-04-17 17:43:13

标签: javascript algorithm dom tree

我需要用这样的路径转换对象数组:

[
  {
    id: 1,
    path:['A'],
    label:"A1",
  },
  {
    id: 2,
    path:['AA'],
    label:"AA1"
  },
  {
    id: 3,
    path:['A', 'B', 'C'],
    label:"ABC1"
  },
  {
    id: 4,
    path:['A', 'B'],
    label:"AB1"
  },
  {
    id: 5,
    path:['A', 'B', 'C'],
    label:"ABC2"
  }
]

像树一样的东西:

[
  {
    key:'A', //current path
    children:[ // childrens of current path
      {
        id: 1,
        path:['A'],
        label:"A1"
      },
      {
        key:'B',
        children: [
          {
            id: 4,
            path:['A', 'B'],
            label:"AB1"
          },
          {
            key:"C",
            children:[
              {
                id: 3,
                path:['A', 'B', 'C'],
                label:"ABC1"
              },
              {
                id: 5,
                path:['A', 'B', 'C'],
                label:"ABC2"
              }
            ]
          }
        ]
      }
    ]
  },
  {
    key: 'AA',
    children:[
      {
        id: 2,
        path:['AA'],
        label:"AA1"
      },
     ]
  }
]

我需要这个来创建嵌套的折叠菜单。 类似的东西

  • A
    • ...一个项目
      • ...b 的项目
      • C
        • ...c 项
  • AA
    • ...AA 项目

提前谢谢,我知道这不是那么难的问题,但仍然有一些问题( 或者,如果我做了坏事或者是更好的方法,请回复我很乐意提供所有帮助)

1 个答案:

答案 0 :(得分:0)

您可以使用递归:

var data = [{'id': 1, 'path': ['A'], 'label': 'A1'}, {'id': 2, 'path': ['AA'], 'label': 'AA1'}, {'id': 3, 'path': ['A', 'B', 'C'], 'label': 'ABC1'}, {'id': 4, 'path': ['A', 'B'], 'label': 'AB1'}, {'id': 5, 'path': ['A', 'B', 'C'], 'label': 'ABC2'}]
function to_tree(d){
   var new_d = {}
   for (var i of d){
      var k = i._path.shift()
      if (!(k in new_d)){
         new_d[k] = []
      }
      new_d[k].push(i)
   }
   return Object.keys(new_d).map(function(x){
        var _pl = {0:[], 1:[]}
        for (var i of new_d[x]){
           _pl[i._path.length > 0 ? 1 :0].push(i)
        }
        return {key:x, children:[..._pl[0].map(function(j){
               delete j['_path']
               return j
           }), to_tree(_pl[1])]}
    });
}
var new_data = data.map(function(x){return {...x, '_path':JSON.parse(JSON.stringify(x.path))}})
console.log(to_tree(new_data))

输出:

[{'key': 'A', 'children': [{'id': 1, 'path': ['A'], 'label': 'A1'}, [{'key': 'B', 'children': [{'id': 4, 'path': ['A', 'B'], 'label': 'AB1'}, [{'key': 'C', 'children': [{'id': 3, 'path': ['A', 'B', 'C'], 'label': 'ABC1'}, {'id': 5, 'path': ['A', 'B', 'C'], 'label': 'ABC2'}, []]}]]}]]}, {'key': 'AA', 'children': [{'id': 2, 'path': ['AA'], 'label': 'AA1'}, []]}]
相关问题