写一个其他方法(可有其他辅助方法)
参数为一个对象,该对象的键值是节点,值是一个数组,里面放着这个节点的所有子孙节点{父子关系单向,children:[]}
例如
// 参数:
{
"A": ["B", "C", "D", "F", "G", "H"],
"K": ["B"],
"B": ["F", "G",],
"C": ["H"],
"D": ["H"],
"E": ["I"],
"F": [],
"G": [],
"H": [],
"I": [],
"J": []
}
返回结果(数组中的顺序不一定要和下面的一样):
[
{
// 节点名字
node: "A",
// 其孩子节点数组
children: [
{
node: "B",
children: [
{
node: "F",
children: []
},
{
node: "G",
children: []
}
]
},
{
node: "C",
children: [
{
node: "H",
children: []
}
]
},
{
node: "D",
children: [
{
node: "H",
children: []
}
]
}
]
},
{
node: "K",
children: [
{
node: "B",
children: [
{
node: "F",
children: []
},
{
node: "G",
children: []
}
]
}
]
},
{
node: "E",
children: [
{
node: "I",
children: []
}
]
},
{
node: "J",
children: []
}
]
代码实现:
function treeData(obj) {
var arr = []
var arr1 = []
for (let item in obj) {
let nodes = { node: item, children: [] }
if (obj[item].length) {
obj[item].forEach(el => {
nodes.children.push({ node: el, children: [] })
});
}
arr.push(nodes)
}
arr.forEach(val => {
val.children.forEach(item => {
let test = arr.filter(child => child.node == item.node)
item.children = test[0].children
arr1.push(test)
})
})
return arr.filter(val => {
return arr1.every(child => child[0].node != val.node)
})
}
有其他简单的写法可在评论区留言共同进步!!!