65.js 对象转换为树形结构

书诚小驿2025/02/21前端面经算法JavaScript

js 对象转换为树形结构

题目

嵌请实现一个函数 convertToTree,将以下形式的数组对象转换为树形结构。

要求

TIP

  1. 输入数组对象中,每个对象包含 id、name 和 parentId 三个属性。id 是唯一标识,parentId 表示该对象的父级 id,parentId 为 null 表示该对象是根节点。
  2. 输出的树形结构中,每个节点对象除了原有的 id 和 name 属性外,还需要添加一个 children 属性,用于存储该节点的子节点数组。如果没有子节点,则 children 为[]。
  3. 请确保函数能够正确处理任意层级的嵌套关系,并且输出的树形结构是按照输入数组中对象的顺序构建的。
  4. 请使用 JavaScript 实现,并在代码中添加必要的注释,说明关键步骤和逻辑

示例

// 输入
const data = [
  { id: 1, name: "部门A", parentId: null },
  { id: 2, name: "部门B", parentId: null },
  { id: 3, name: "部门C", parentId: 1 },
  { id: 4, name: "部门D", parentId: 1 },
  { id: 5, name: "部门E", parentId: 2 },
  { id: 6, name: "部门F", parentId: 3 },
  { id: 7, name: "部门G", parentId: 3 },
];
// 输出
[
  {
    id: 1,
    name: "部门A",
    children: [
      {
        id: 3,
        name: "部门C",
        children: [
          { id: 6, name: "部门F" },
          { id: 7, name: "部门G" },
        ],
      },
      { id: 4, name: "部门D" },
    ],
  },
  {
    id: 2,
    name: "部门B",
    children: [{ id: 5, name: "部门E" }],
  },
];

示例代码模版

<script>
  function convertToTree(data) {
    // 请在此处实现代码
  }

  // 测试用例
  const data = [
    { id: 1, name: '部门A', parentId: null },
    { id: 2, name: '部门B', parentId: null },
    { id: 3, name: '部门C', parentId: 1 },
    { id: 4, name: '部门D', parentId: 1 },
    { id: 5, name: '部门E', parentId: 2 },
    { id: 6, name: '部门F', parentId: 3 },
    { id: 7, name: '部门G', parentId: 3 },
  ];

  const result = convertToTree(data);
  console.log(result);
</script>

参考答案

DETAILS
<script>
    function convertToTree(data) {
      // 创建一个映射表,用于快速查找每个节点
      const nodeMap = {};
      data.forEach((item) => {
        nodeMap[item.id] = { id: item.id, name: item.name, children: [] }; // 为每个节点添加children属性
      });

      // 创建一个数组,用于存储根节点
      const tree = [];

      data.forEach((item) => {
        if (item.parentId === null) {
          // 如果parentId为null,说明是根节点,直接添加到tree数组中
          tree.push(nodeMap[item.id]);
        } else {
          // 如果有parentId,说明是子节点,找到其父节点并添加到父节点的children数组中
          const parent = nodeMap[item.parentId];
          if (parent) {
            parent.children.push(nodeMap[item.id]);
          }
        }
      });

      return tree;
    }

    // 测试用例
    const data = [
      { id: 1, name: '部门A', parentId: null },
      { id: 2, name: '部门B', parentId: null },
      { id: 3, name: '部门C', parentId: 1 },
      { id: 4, name: '部门D', parentId: 1 },
      { id: 5, name: '部门E', parentId: 2 },
      { id: 6, name: '部门F', parentId: 3 },
      { id: 7, name: '部门G', parentId: 3 },
    ];

    const result = convertToTree(data);
    console.log(result);
  </script>
最后更新时间' 2025/2/23 01:48:16