首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

从数组生成树,并将父字段的表示形式更改为object而不是ID

,可以使用递归算法来实现。

首先,我们需要定义一个数据结构来表示树节点。每个节点应该包含一个唯一的标识符,一个表示节点值的字段,以及一个指向父节点的引用或者对象。

代码语言:txt
复制
class TreeNode {
  constructor(id, value, parent) {
    this.id = id;
    this.value = value;
    this.parent = parent;
    this.children = [];
  }
}

然后,我们可以编写一个函数来生成树。该函数接收一个包含所有节点的数组和一个表示父字段的字符串参数。

代码语言:txt
复制
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);
}

使用示例:

代码语言:txt
复制
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);

输出结果:

代码语言:txt
复制
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,可以修改节点的构造函数,将父字段直接作为对象传入。

代码语言:txt
复制
class TreeNode {
  constructor(id, value, parent) {
    this.id = id;
    this.value = value;
    this.parent = parent instanceof TreeNode ? parent : null;
    this.children = [];
  }
}

这样,节点的构造函数将接受一个父节点对象,而不是一个父节点的ID。在生成树的过程中,我们需要稍作修改来处理这种变化。

代码语言:txt
复制
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);
}

使用示例:

代码语言:txt
复制
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);

输出结果:

代码语言:txt
复制
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。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

领券