,可以使用递归算法来实现。
首先,我们需要定义一个数据结构来表示树节点。每个节点应该包含一个唯一的标识符,一个表示节点值的字段,以及一个指向父节点的引用或者对象。
class TreeNode {
constructor(id, value, parent) {
this.id = id;
this.value = value;
this.parent = parent;
this.children = [];
}
}
然后,我们可以编写一个函数来生成树。该函数接收一个包含所有节点的数组和一个表示父字段的字符串参数。
function generateTree(nodes, parentField) {
// 创建一个空的节点映射表,用于根据id查找节点
const nodeMap = {};
// 构建节点映射表
for (const node of nodes) {
nodeMap[node.id] = new TreeNode(node.id, node.value, null);
}
// 构建树结构
for (const node of nodes) {
const parentNode = nodeMap[node[parentField]];
const currentNode = nodeMap[node.id];
// 将当前节点添加到父节点的子节点列表中
if (parentNode) {
parentNode.children.push(currentNode);
currentNode.parent = parentNode;
}
}
// 返回根节点
return Object.values(nodeMap).find(node => !node.parent);
}
使用示例:
const nodes = [
{ id: 1, value: 'A', parent: null },
{ id: 2, value: 'B', parent: 1 },
{ id: 3, value: 'C', parent: 1 },
{ id: 4, value: 'D', parent: 2 },
{ id: 5, value: 'E', parent: 2 },
{ id: 6, value: 'F', parent: 3 },
];
const tree = generateTree(nodes, 'parent');
console.log(tree);
输出结果:
TreeNode {
id: 1,
value: 'A',
parent: null,
children: [
TreeNode { id: 2, value: 'B', parent: [Circular], children: [Array] },
TreeNode { id: 3, value: 'C', parent: [Circular], children: [Array] }
]
}
对于父字段的表示形式更改为对象而不是ID,可以修改节点的构造函数,将父字段直接作为对象传入。
class TreeNode {
constructor(id, value, parent) {
this.id = id;
this.value = value;
this.parent = parent instanceof TreeNode ? parent : null;
this.children = [];
}
}
这样,节点的构造函数将接受一个父节点对象,而不是一个父节点的ID。在生成树的过程中,我们需要稍作修改来处理这种变化。
function generateTree(nodes, parentField) {
// 创建一个空的节点映射表,用于根据id查找节点
const nodeMap = {};
// 构建节点映射表
for (const node of nodes) {
nodeMap[node.id] = new TreeNode(node.id, node.value);
}
// 构建树结构
for (const node of nodes) {
const parentNode = node[parentField];
const currentNode = nodeMap[node.id];
// 将当前节点添加到父节点的子节点列表中
if (parentNode) {
const parent = nodeMap[parentNode.id];
if (parent) {
parent.children.push(currentNode);
currentNode.parent = parent;
}
}
}
// 返回根节点
return Object.values(nodeMap).find(node => !node.parent);
}
使用示例:
const nodes = [
{ id: 1, value: 'A', parent: null },
{ id: 2, value: 'B', parent: { id: 1 } },
{ id: 3, value: 'C', parent: { id: 1 } },
{ id: 4, value: 'D', parent: { id: 2 } },
{ id: 5, value: 'E', parent: { id: 2 } },
{ id: 6, value: 'F', parent: { id: 3 } },
];
const tree = generateTree(nodes, 'parent');
console.log(tree);
输出结果:
TreeNode {
id: 1,
value: 'A',
parent: null,
children: [
TreeNode { id: 2, value: 'B', parent: [Circular], children: [Array] },
TreeNode { id: 3, value: 'C', parent: [Circular], children: [Array] }
]
}
这样,我们通过递归算法从数组生成了一棵树,并且将父字段的表示形式更改为了对象而不是ID。
领取专属 10元无门槛券
手把手带您无忧上云