我正在处理 TreeView ,并构建了一个简单的节点类:它由一个名称和一个子级数组组成:
class Node {
constructor(name, childNodes) {
this.name = name;
this.childNodes = childNodes;
}
}
现在我的目标是创建一个返回这样的对象的函数:
var tree = [
{
text: 'Parent 1',
nodes: [
{
text: 'Child 1',
nodes: [
{
text: 'Grandchild 1'
}
]
},
{
text: 'Child 2'
}
]
},
{
text: 'Parent 2'
},
];
我尝试使用递归方法。它从一个空数组开始并添加子数组,直到没有剩余数组为止:
function recTreeview(currentNode, treeview) {
var tempChildren = [];
currentNode.childNodes.forEach(child => {
tempChild.push(recTreeview(child, treeview));
});
return treeview.push({
text: currentNode.name,
nodes: tempChildren
})
}
但是递归 Treeview 函数的某些部分一定是错误的。当我创建树并尝试在 chrome 开发控制台中打开它时,它只显示“5”,而不是 (5) [{…}, {…}, {…}, {…}, {…} ]。我做错了什么?
tree = recTreeview(parent, []);
tree;
最佳答案
您返回的是push
的结果,而不是实际的treeview
。
根据 Array.prototype.push()
docs
Return value
The newlength
property of the object upon which the method was called.
因此,不要返回treeview.push(...)
,而是treeview.push(...)
,然后返回treeview
function recTreeview(currentNode, treeview) {
var tempChildren = [];
currentNode.childNodes.forEach(child => {
tempChild.push(recTreeview(child, treeview));
});
treeview.push({
text: currentNode.name,
nodes: tempChildren
});
return treeview;
}
关于Javascript 树结构到数组的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50019318/