我需要用这样的路径转换对象数组:
[
{
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"
},
]
}
]
我需要这个来创建嵌套的折叠菜单。 类似的东西
提前谢谢,我知道这不是那么难的问题,但仍然有一些问题( 或者,如果我做了坏事或者是更好的方法,请回复我很乐意提供所有帮助)
答案 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'}, []]}]