在 Typescript 中构建嵌套的 TreeNode 数组
Building nested TreeNode array in Typescript
给定一个 TreeNode 类型的平面一维数组(见下面的接口定义),我想遍历数组并将后续数组元素添加为 children。
递归执行会很棒,我在 non-recursion 的镜头使用了一个缓冲区,但我面临的问题是如何做 node.children[0].children[0]...children[0]
因为注意到只有一个 child 每 parent。
Childify(results: TreeNode[]): any {
var node: TreeNode;
var buffer: TreeNode;
var count: number = 0;
for (var res of results) {
if (count == 0) {
node = res[0];
buffer = res[0];
buffer.children = [];
node.children = [];
} else if (count == 1) {
buffer.children = res[0];
} else {
node = buffer;
node.children = [];
node.children.push(res[0]);
buffer = <TreeNode>node.children;
}
count++;
}
}
接口定义:
export interface TreeNode {
label?: string;
data?: any;
icon?: any;
expandedIcon?: any;
collapsedIcon?: any;
children?: TreeNode[]; <---------------
leaf?: boolean;
expanded?: boolean;
type?: string;
parent?: TreeNode;
partialSelected?: boolean;
styleClass?: string;
draggable?: boolean;
droppable?: boolean;
selectable?: boolean;
}
输入:
TreeNode[] = [treeNode1, treeNode2, treeNode3,
treeNode4,...,treeNodeX]
输出是一个 TreeNode object,由 children 属性(也是 TreeNode 类型)嵌套:
TreeNode = treeNode1
treeNode1.children = treeNode2
treeNode2.children = treeNode3
treeNode3.children = treeNode4
treeNodeX-1.children = treeNodeX
我不知道如何为X号动态调用treeNode1.children[0].children[0]......children[0]循环中的children,分配给treeNode1中的下一层children。
我已经为你建立了一个算法。我用简单的 javascript 构建了它,但它应该很容易修改以符合您的打字稿界面。
代码在这里:
var flatNodes = [
{
name: 'node1',
children: []
},
{
name: 'node2',
children: []
},
{
name: 'node3',
children: []
},
{
name: 'node4',
children: []
},
{
name: 'node5',
children: []
}
];
function linkNodes(flatNodes) {
flatNodes = flatNodes.slice(); //copy the list
flatNodes = flatNodes.reverse();
for (var i = 1; i < flatNodes.length; i++) {
var previousNode = flatNodes[i - 1];
var currentNode = flatNodes[i];
currentNode.children.push(previousNode);
}
return flatNodes[flatNodes.length - 1];
}
console.log(linkNodes(flatNodes));
输出在这里:
{
"name": "node1",
"children": [
{
"name": "node2",
"children": [
{
"name": "node3",
"children": [
{
"name": "node4",
"children": [
{
"name": "node5",
"children": []
}
]
}
]
}
]
}
]
}
我不懂 TypeScript,但在 JavaScript 中我会这样做:
const input = [ new TreeNode("node1")
, new TreeNode("node2")
, new TreeNode("node3")
, new TreeNode("node4")
, new TreeNode("node5")
];
const output = input.reduceRight((child, parent) => {
parent.children.push(child);
return parent;
});
console.log(output);
function TreeNode(name) {
this.name = name;
this.children = [];
}
希望对您有所帮助。
给定一个 TreeNode 类型的平面一维数组(见下面的接口定义),我想遍历数组并将后续数组元素添加为 children。
递归执行会很棒,我在 non-recursion 的镜头使用了一个缓冲区,但我面临的问题是如何做 node.children[0].children[0]...children[0]
因为注意到只有一个 child 每 parent。
Childify(results: TreeNode[]): any {
var node: TreeNode;
var buffer: TreeNode;
var count: number = 0;
for (var res of results) {
if (count == 0) {
node = res[0];
buffer = res[0];
buffer.children = [];
node.children = [];
} else if (count == 1) {
buffer.children = res[0];
} else {
node = buffer;
node.children = [];
node.children.push(res[0]);
buffer = <TreeNode>node.children;
}
count++;
}
}
接口定义:
export interface TreeNode {
label?: string;
data?: any;
icon?: any;
expandedIcon?: any;
collapsedIcon?: any;
children?: TreeNode[]; <---------------
leaf?: boolean;
expanded?: boolean;
type?: string;
parent?: TreeNode;
partialSelected?: boolean;
styleClass?: string;
draggable?: boolean;
droppable?: boolean;
selectable?: boolean;
}
输入:
TreeNode[] = [treeNode1, treeNode2, treeNode3, treeNode4,...,treeNodeX]
输出是一个 TreeNode object,由 children 属性(也是 TreeNode 类型)嵌套:
TreeNode = treeNode1
treeNode1.children = treeNode2
treeNode2.children = treeNode3
treeNode3.children = treeNode4
treeNodeX-1.children = treeNodeX
我不知道如何为X号动态调用treeNode1.children[0].children[0]......children[0]循环中的children,分配给treeNode1中的下一层children。
我已经为你建立了一个算法。我用简单的 javascript 构建了它,但它应该很容易修改以符合您的打字稿界面。
代码在这里:
var flatNodes = [
{
name: 'node1',
children: []
},
{
name: 'node2',
children: []
},
{
name: 'node3',
children: []
},
{
name: 'node4',
children: []
},
{
name: 'node5',
children: []
}
];
function linkNodes(flatNodes) {
flatNodes = flatNodes.slice(); //copy the list
flatNodes = flatNodes.reverse();
for (var i = 1; i < flatNodes.length; i++) {
var previousNode = flatNodes[i - 1];
var currentNode = flatNodes[i];
currentNode.children.push(previousNode);
}
return flatNodes[flatNodes.length - 1];
}
console.log(linkNodes(flatNodes));
输出在这里:
{
"name": "node1",
"children": [
{
"name": "node2",
"children": [
{
"name": "node3",
"children": [
{
"name": "node4",
"children": [
{
"name": "node5",
"children": []
}
]
}
]
}
]
}
]
}
我不懂 TypeScript,但在 JavaScript 中我会这样做:
const input = [ new TreeNode("node1")
, new TreeNode("node2")
, new TreeNode("node3")
, new TreeNode("node4")
, new TreeNode("node5")
];
const output = input.reduceRight((child, parent) => {
parent.children.push(child);
return parent;
});
console.log(output);
function TreeNode(name) {
this.name = name;
this.children = [];
}
希望对您有所帮助。