首页 > 其他分享 >js 树形数组转一维数组,或一维数组转树形数组

js 树形数组转一维数组,或一维数组转树形数组

时间:2024-07-13 16:29:48浏览次数:9  
标签:Node name pid 数组 children 树形 一维 id

树形数组转一维数组

要将一棵树结构(包含 children 属性)拍平为一个一维数组,可以使用递归或迭代的方法。下面是两种常见的实现方式:

1. 使用递归

function flattenTree(tree) {
  let result = [];

  tree.forEach(node => {
    result.push(node);
    if (node.children) {
      result = result.concat(flattenTree(node.children));
    }
  });

  return result;
}

// 示例
const tree = [
  {
    id: 1,
    name: "Node 1",
    children: [
      { id: 2, name: "Node 1.1" },
      { id: 3, name: "Node 1.2", children: [{ id: 4, name: "Node 1.2.1" }] }
    ]
  },
  { id: 5, name: "Node 2" }
];

const flatTree = flattenTree(tree);
console.log(flatTree);

2. 使用迭代(栈)

function flattenTree(tree) {
  const result = [];
  const stack = [...tree];

  while (stack.length) {
    const node = stack.pop();
    result.push(node);
    if (node.children) {
      stack.push(...node.children);
    }
  }

  return result;
}

// 示例
const tree = [
  {
    id: 1,
    name: "Node 1",
    children: [
      { id: 2, name: "Node 1.1" },
      { id: 3, name: "Node 1.2", children: [{ id: 4, name: "Node 1.2.1" }] }
    ]
  },
  { id: 5, name: "Node 2" }
];

const flatTree = flattenTree(tree);
console.log(flatTree);

结果输出

无论使用递归还是迭代,输出的结果都是一个包含所有节点的扁平数组:

[
  { id: 1, name: "Node 1", children: [...] },
  { id: 2, name: "Node 1.1" },
  { id: 3, name: "Node 1.2", children: [...] },
  { id: 4, name: "Node 1.2.1" },
  { id: 5, name: "Node 2" }
]

小结

  • 递归 方法简单直观,易于理解。
  • 迭代 方法避免了潜在的栈溢出问题,更适合处理较深的树结构。

一维数组转树形数组

要将一个一维数组转换为树形结构,您可以根据每个节点的 pid(父节点 ID)和 id 来构建树形关系。下面是一个简单的实现示例:

实现方法

function arrayToTree(data) {
  const map = {};
  const tree = [];

  // 创建一个映射,方便查找节点
  data.forEach(item => {
    map[item.id] = { ...item, children: [] };
  });

  // 构建树形结构
  data.forEach(item => {
    if (item.pid) {
      map[item.pid].children.push(map[item.id]);
    } else {
      tree.push(map[item.id]);
    }
  });

  return tree;
}

// 示例
const data = [
  { id: 1, name: "Node 1", pid: null },
  { id: 2, name: "Node 1.1", pid: 1 },
  { id: 3, name: "Node 1.2", pid: 1 },
  { id: 4, name: "Node 1.2.1", pid: 3 },
  { id: 5, name: "Node 2", pid: null }
];

const tree = arrayToTree(data);
console.log(JSON.stringify(tree, null, 2));

输出结果

上面的代码将输出以下树形结构:

[
  {
    "id": 1,
    "name": "Node 1",
    "pid": null,
    "children": [
      {
        "id": 2,
        "name": "Node 1.1",
        "pid": 1,
        "children": []
      },
      {
        "id": 3,
        "name": "Node 1.2",
        "pid": 1,
        "children": [
          {
            "id": 4,
            "name": "Node 1.2.1",
            "pid": 3,
            "children": []
          }
        ]
      }
    ]
  },
  {
    "id": 5,
    "name": "Node 2",
    "pid": null,
    "children": []
  }
]

代码解释

  1. 创建映射:首先遍历数组,创建一个以 id 为键的映射,使得可以快速查找每个节点。
  2. 构建树:再次遍历数组,将每个节点根据其 pid 放入其父节点的 children 数组中;如果节点没有父节点(pidnull),则将其推入根节点数组。

这种方法效率较高,时间复杂度为 O(n),适合处理较大的数组。

标签:Node,name,pid,数组,children,树形,一维,id
From: https://www.cnblogs.com/jocongmin/p/18300287

相关文章

  • 【C++编程】数组、函数、结构体、指针、类
    数组:存储一个固定大小的相同类型元素的顺序集合声明、初始化:typearrayName[size0][size1]...={{value00,value01,...},{value10,value11,...},...};intmy_array[2][3]={{1,2,3},{4,5,6}};访问数组元素:arrayName[index0][index1]...;intget_eleme......
  • C语言——数组、sizeof关键字
    一、数组1.数组的引入与定义: C语言中的数组是一种基本的数据结构,用于在计算机内存中连续存储相同类型的数据。数组中的每个元素可以通过索引来访问,索引通常是一个整数,用于指定元素在数组中的位置。在C语言中,数组索引是从0开始的。 要使用数组,必须在程序中先定义数组,即通知......
  • C++数组 字符串
    是什么:相同类型元素的集合写法:intexample[3]//数组在声明大小时必须为常数数组名example是个指针类型如int*ptr=example;数组索引的工作原理:example[3]//从首地址位置偏移数组类型大小(int是4字节)乘索引值(4*3)个字节//从当前字节位置往后读四个字节;可能出现的错误:ex......
  • [LeetCode]961. 在长度 2N 的数组中找出重复 N 次的元素
    /*961.在长度2N的数组中找出重复N次的元素已解答简单给你一个整数数组nums,该数组具有以下属性:nums.length==2*n.nums包含n+1个不同的元素nums中恰有一个元素重复n次找出并返回重复了n次的那个元素。示例1:输入:nums=[1,2,3,3]输出:3示例2:输入......
  • 数组
    数组相同类型数据的有序集合,数组也是对象,数组长度一旦确定不可更改。每一个数据被称为一个数组元素,每个数组元素可以通过索引(下标,从0开始)访问必须先声明数组变量,才能使用数组:数据类型[]数组名称;例:Int[]nums;Java用new操作符创建数组,例:nums=newint[10];获取数......
  • 后缀数组【jiangly模板】
    目录后缀数组简介后缀数组可以用于什么场景如何实现后缀数组倍增法求后缀数组\(height\)数组\(LCP\)(最长公共前缀)\(height\)代码模板参考文章后缀数组是一种非常强大的一种处理字符串问题的工具后缀数组简介前置知识:计数排序、基数排序后缀数组(SuffixArray)主要关系到两......
  • 信息学奥赛初赛天天练-45-CSP-J2020阅读程序1-字符数组默认值、字符串长度、字符数组
    PDF文档公众号回复关键字:202407122020CSP-J阅读程序11阅读程序(程序输入不超过数组或字符串定义的范围;判断题正确填√,错误填×。除特殊说明外,判断题1.5分,选择题3分,共计40分)01#include<cstdlib>02#include<iostream>03usingnamespacestd;0405ch......
  • 数组的基本知识
    数组的定义数组是相同类型数据的有序集合。数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成。其中,每一个数据称作一个数组元素,每个数组元素可以通过一个下标来访问它们。(从0开始)数组声明创建首先必须声明数组变量,才能在程序中使用数组。下面是声明数组......
  • jmetter 后置处理器 针对需要提取数组里的多个值 处理方式
    1.通过正则/Json提取器,提取整个数组值2.在增加JSR223PostProcessor后置处理器,可以方便编写简单处理脚本 选择自己熟悉的语言,jython需要下载jar包,放在jmeterlib目录下 3.脚本里用vars.get()获取之前提取器提取的数组值jmater参数都是json串格式,所以后面处理提取......
  • Oracle、达梦:拼接数组数据为一行
    一、普通拼接1、需求oracle查询的数据是:value1123怎么获取:1/2/32、实现value1:是要拼接的字段value2:是表中的任意字段-可用于排序的字段,也可以是value1--使用LISTAGG函数将多行数据连接成一个字符串,以'/'作为连接符SELECTLISTAGG(value1,'/')......