算法:将数组转换为树形结构

45 阅读1分钟

输入:

[
    {
      id: 12,
      parent_id: 1,
      name: "朝阳区",
    },
    {
      id: 241,
      parent_id: 12,
      name: "三元桥",
    },
    {
      id: 13,
      parent_id: 1,
      name: "海淀",
    },
    {
      id: 1,
      parent_id: 0,
      name: "北京市",
    },
  ];

输出

  [
      {
          "id":1,
          "parent_id":0,
          "name":"北京市",
          "children":[
              {
                  "id":12,
                  "parent_id":1,
                  "name":"朝阳区",
                  "children":[
                      {
                          "id":241,
                          "parent_id":12,
                          "name":"三元桥",
                          "children":[]
                       }
                   ]
              },{
                  "id":13,
                  "parent_id":1,
                  "name":"海淀",
                  "children":[]
              }
          ]
      }
  ]
/**
 * 将数组转换为树形结构
 * @param {Array} arr - 输入的数组,每个元素包含id、parent_id和name属性
 * @returns {Array} - 转换后的树形结构数组
 */
function toTreeArr(arr) {
    // 初始化结果数组
    const tree = [];
    // 初始化映射对象,用于快速查找
    const map = {};
    // 遍历数组,将每个元素存储在映射中,并添加一个空的children数组
    arr.forEach((item) => {
        map[item.id] = { ...item, children: [] };
    });

    // 遍历映射,构建树形结构
    Object.values(map).forEach((item) => {
        // 如果当前元素的parent_id为0,则将其添加到结果数组中
        if (item.parent_id === 0) {
            tree.push(item);
        } else {
            // 否则,将其添加到父元素的children数组中
            map[item.parent_id].children.push(item);
        }
    });
    // 返回结果数组
    return tree;
}