首页 > 其他分享 >将数组改写成树结构

将数组改写成树结构

时间:2023-04-26 23:24:15浏览次数:29  
标签:node const name 树结构 节点 改写 数组 children

首先创建了一个空的根节点root,并将它的名称设置为空字符串,它的子节点数组设置为空数组。然后遍历整个数组,对于每个元素,在树形结构中创建对应的节点。遍历每个元素的名称,并通过比较父节点和子节点的名称来连接它们。如果节点不存在,则创建一个新节点并将它添加到父节点的子节点数组中。最后,返回整个树形结构的根节点的子节点数组。

代码:

function arrayToTree(array) {
    // 创建一个空的根节点
    const root = { name: '', children: [] };
    
    // 遍历数组中的每个元素
    array.forEach(item => {
      let currentNode = root;
      
      // 遍历每个元素的名称
      item.forEach(name => {
        let childNode = currentNode.children.find(child => child.name === name);
        
        // 如果节点不存在,则创建一个新节点
        if (!childNode) {
          childNode = { name, children: [] };
          currentNode.children.push(childNode);
        }
        
        currentNode = childNode;
      });
    });
    
    return root.children;
  }
  
  const array = [['a','b','c'],['a','b','c1'],['a','b1','c2'],['a1','b']];
  const tree = arrayToTree(array);
  console.log(tree);

在这个代码中,我们假设每个节点的名称都是字符串。如果节点名称不是字符串,我们需要对比较函数进行修改。另外,如果节点具有其他属性或方法,则可以将它们添加到节点对象中。

其他:

function buildTree(data, rootId) {
  const tree = [];
  const lookup = {};
  data.forEach(node => {
    lookup[node.id] = node;
    node.children = [];
  });
  data.forEach(node => {
    if (node.parent_id === rootId) {
      tree.push(node);
    } else {
      const parent = lookup[node.parent_id];
      parent.children.push(node);
    }
  });
  return tree;
}

标签:node,const,name,树结构,节点,改写,数组,children
From: https://www.cnblogs.com/shallow-dreamer/p/17357702.html

相关文章

  • 2022-04-26:给定一个数组componets,长度为A, componets[i] = j,代表i类型的任务需要耗时j
    2022-04-26:给定一个数组componets,长度为A,componets[i]=j,代表i类型的任务需要耗时j给定一个二维数组orders,长度为M,orders[i][0]代表i号订单下单时间orders[i][1]代表i号订单是哪种类型的任务,毫无疑问orders[i][1]<A一开始所有流水线都在0时刻待命,给定一个正数nums,表示流水......
  • leetcode-350-两个数组的交集 II 题解
    题目给定两个数组,编写一个函数来计算它们的交集。示例1:输入:nums1=[1,2,2,1],nums2=[2,2]输出:[2,2]示例2:输入:nums1=[4,9,5],nums2=[9,4,9,8,4]输出:[4,9]说明:输出结果中每个元素出现的次数,应与元素在两个数组中出现次数的最小值一致。我们可以不考虑输出结果......
  • #yyds干货盘点# LeetCode面试题:合并两个有序数组
    1.简述:给你两个按非递减顺序排列的整数数组 nums1和nums2,另有两个整数m和n,分别表示nums1和nums2中的元素数目。请你合并nums2到nums1中,使合并后的数组同样按非递减顺序排列。注意:最终,合并后数组不应由函数返回,而是存储在数组nums1中。为了应对这种情况,nums1......
  • go:函数高级、包的使用、if-else、循环、switch、数组
    目录一、函数高级二、包的使用三、if-else四、循环五、switch六、数组七、作业python实现链表一、函数高级1、函数的参数和返回值都是类型的一部分,函数可以赋值给一个变量,有两种情况:test3函数,接收一个参,参数是函数类型:没有参数没有返回值test3有返回值,返回值是个函数:函数......
  • 力扣---1031. 两个非重叠子数组的最大和
    给你一个整数数组nums和两个整数firstLen和secondLen,请你找出并返回两个非重叠子数组中元素的最大和,长度分别为firstLen和secondLen。长度为firstLen的子数组可以出现在长为secondLen的子数组之前或之后,但二者必须是不重叠的。子数组是数组的一个连续部分。 ......
  • 每日打卡一维数组和二维数组传参的几种方式
    //一组数组传参//#include<stdio.h> //voidInputArray(intn[],inta);//voidOutputArray(intn[],inta);//intmain()//{// intm[3];// InputArray(m,3);// OutputArray(m,3);// return0;//}//voidInputArray(intm[],intn)//{// for(inti=0;i<n;i++)......
  • AcWing 242. 一个简单的整数问题 / 树状数组区间修改区间查询模板题
    AcWing242.一个简单的整数问题//实例化是抽象的天敌,是抽象的克星//通过公式sn=(i从1~n求积)di*(1+n)-(i从1~n求积)i*di//来计算前缀和,又(i从1~n求积)i*di不能由(i从1~n求积)di*(1+n)推出//所以除了维护d数组,还需维护......
  • go语言 函数高级、包的使用、if-else、循环、switch、数组
    函数高级//函数1没有参数没有返回值fun函数名(){}2有参数没有返回值fun函数名(aint){}3多个参数同一种类型,可以简写fun函数名(a,bint){}4多个参数同一种类型,有返回值可以简写fun函数名(a,bint)int{retruna+b}5多个返回值fun......
  • 1031. 两个非重叠子数组的最大和
    题目链接:1031.两个非重叠子数组的最大和方法:前缀和+哈兮解题思路考虑暴力解法,枚举以\(i\)结尾的长度为\(firstLen\)的子数组,求\([i+1,n-1]\)中长度为\(secondLen\)长度的子数组和的最大值,最后取两者和的最大值;优化:前缀和+哈兮假设\(firstLen\)在\(sec......
  • 循环控制:链表和数组
    循环是常用的流程环节。1//链表控制2//链表控制的优点,是通过指针来定位,那么循环的过程中,即是可变的,实时性很强。3vartmp*datastruct.ListNode4tmp=&datastruct.ListNode{Val:-1,Next:nil}56i:=07fornode:=tmp;node!=......