如何有效地从树结构构建树
How to efficiently build a tree from a tree structure
我有一堆树状结构的对象。但目前这个结构对我不起作用,因为我需要使用v-teeview,所以我需要重构它....
我目前的树结构是这样的:
items: [
{
data: [
{ ... },
],
children: [],
},
{
data: [{ ... }],
children: [{...}, {...}]
}
]
我需要重组如下内容:
items: [
{
id: 76,
name: "ADIS ",
children: [],
},
{
id: 64,
name: "YSVERIS",
children: [
{
id: 85,
name: "MERCEDES",
children: [],
},
{
id: 83,
name: "YNGRIBEL",
children: [],
},
],
}
]
所以,我实现了一个函数递归,这个函数是为了重构树。
export default {
methods: {
createTree(items) {
items.forEach((element) => {
if (element.children.length === 0) {
this.datatree.push({
id: element.data[0].id,
name: element.data[0].name,
children: [],
});
} else {
this.datatree.push({
id: element.data[0].id,
name: element.data[0].name,
children: this.createTree(element.children),
});
}
});
console.log("root: ", this.datatree);
},
},
mounted() {
this.createTree(this.items);
},
}
所以我现在的问题是,当我构建新树时,它的子树是未定义的,我做错了什么?
在我的示例代码中,我使用 console.log() 来查看新树
createTree()
return没什么,所以将 return 值分配给 children
只会使 children
具有 undefined
值。
一个解决方案是递归调用一个辅助方法(例如,名为“createNode
”),它从每个数组元素创建树节点(而不是递归调用 createTree()
)。 Return 来自 createTree()
的结果,并将 return 值分配给 datatree
:
function createTree(items) {
const createNode = ({ data, children }) => ({
...data[0],
children: children?.map(child => createNode(child))
})
return items.map(item => createNode(item))
}
// MyComponent.vue
export default {
mounted() {
this.datatree = createTree(this.items)
}
}
我有一堆树状结构的对象。但目前这个结构对我不起作用,因为我需要使用v-teeview,所以我需要重构它....
我目前的树结构是这样的:
items: [
{
data: [
{ ... },
],
children: [],
},
{
data: [{ ... }],
children: [{...}, {...}]
}
]
我需要重组如下内容:
items: [
{
id: 76,
name: "ADIS ",
children: [],
},
{
id: 64,
name: "YSVERIS",
children: [
{
id: 85,
name: "MERCEDES",
children: [],
},
{
id: 83,
name: "YNGRIBEL",
children: [],
},
],
}
]
所以,我实现了一个函数递归,这个函数是为了重构树。
export default {
methods: {
createTree(items) {
items.forEach((element) => {
if (element.children.length === 0) {
this.datatree.push({
id: element.data[0].id,
name: element.data[0].name,
children: [],
});
} else {
this.datatree.push({
id: element.data[0].id,
name: element.data[0].name,
children: this.createTree(element.children),
});
}
});
console.log("root: ", this.datatree);
},
},
mounted() {
this.createTree(this.items);
},
}
所以我现在的问题是,当我构建新树时,它的子树是未定义的,我做错了什么?
在我的示例代码中,我使用 console.log() 来查看新树
createTree()
return没什么,所以将 return 值分配给 children
只会使 children
具有 undefined
值。
一个解决方案是递归调用一个辅助方法(例如,名为“createNode
”),它从每个数组元素创建树节点(而不是递归调用 createTree()
)。 Return 来自 createTree()
的结果,并将 return 值分配给 datatree
:
function createTree(items) {
const createNode = ({ data, children }) => ({
...data[0],
children: children?.map(child => createNode(child))
})
return items.map(item => createNode(item))
}
// MyComponent.vue
export default {
mounted() {
this.datatree = createTree(this.items)
}
}