普通数组 怎么 转成多叉树

{nettypeL"4G",name:"CQT",temp:"测试项一"},
{nettypeL"4G",name:"CQT",temp:"测试项二"},
{nettypeL"4G",name:"CQT",temp:"测试项三"},
{nettypeL"4G",name:"CYZ",temp:"测试项一"},
{nettypeL"4G",name:"NEYT",temp:"测试项一"},
{nettypeL"4G",name:"NEYT",temp:"测试项二"},
{nettypeL"4G",name:"CC",temp:"测试项一"},
{nettypeL"5G",name:"CA",temp:"测试项一"},
{nettypeL"5G",name:"QQPO",temp:"测试项一"},
{nettypeL"5G",name:"NEYT",temp:"测试项一"},
{nettypeL"5G",name:"NEYT",temp:"测试项二"},

这种结构怎么转成

{
  id:"root",
  value: {name: "测试项“,level: 1},
  children: [
    { id:"4G",  value: {name: "4G“,level: 2},
      children: [
        { id:"CQT", value: {name: "CQT“,level: 3}, children: [....], },
        {...}
      ],
    },
    { id:"5G", value: {name: "5G“,level: 2},
      children: [
        { id:"CA", value: {name: "CA“,level: 3}, children: [....], },
        {....}
      ],
    }
  ],
},

    const array = [
      { id: 1, parentId: 0, name: "菜单1" },
      { id: 2, parentId: 0, name: "菜单2" },
      { id: 3, parentId: 0, name: "菜单3" },
      { id: 4, parentId: 1, name: "菜单4" },
      { id: 5, parentId: 1, name: "菜单5" },
      { id: 6, parentId: 2, name: "菜单6" },
      { id: 7, parentId: 4, name: "菜单7" },
      { id: 8, parentId: 7, name: "菜单8" },
      { id: 9, parentId: 8, name: "菜单9" },
      { id: 10, parentId: 9, name: "菜单10" },
      { id: 11, parentId: 10, name: "菜单11" },
      { id: 12, parentId: 11, name: "菜单12" },
      { id: 13, parentId: 12, name: "菜单13" },
      { id: 14, parentId: 13, name: "菜单14" },
    ];

/**
 * 方法二:递归实现
 * @param { Array } list 数组
 * @param { String } parentId 父级 id
 * @param { Object } param2 可配置参数
 */
 
const generateTree = (
  list,
  parentId = 0,
  { idName = "id", parentIdName = "parentId", childName = "children" } = {}
) => {
  if (!Array.isArray(list)) {
    throw new Error("type only Array");
    // new Error("type only Array");
    return list;
  }
  return list.reduce((pre, cur) => {
    // 找到parentId 的子节点之后,递归找子节点的下一级节点
    if (cur[parentIdName] === parentId) {
      const children = generateTree(list, cur[idName]);
      if (children?.length) {
        cur[childName] = children;
      }
      return [...pre, cur];
    }
    return pre;
  }, []);
};
const result = generateTree(array, 0);