JavaScript 实现树形结构和一维数组互相转换

news/2024/7/15 17:01:31 标签: javascript, 开发语言, ecmascript, react.js, 前端

背景

树形结构和一维数组是开发中很容易碰到的情况,也是面试中很容易碰到的手撕题目
在这里插入图片描述

实现

一、一维数组转树形结构

FROM

const source = [
  { id: 1, name: "张三", pid: 0 },
  { id: 2, name: "李四", pid: 1 },
  { id: 3, name: "王五", pid: 2 },
  { id: 4, name: "赵六", pid: 3 },
  { id: 5, name: "陈七", pid: 4 },
  { id: 6, name: "谢八", pid: 4 },
  { id: 7, name: "林一", pid: 1 },
  { id: 8, name: "杨二", pid: 3 },
];

TO

[
  {
    "id": 1,
    "name": "张三",
    "pid": 0,
    "children": [
      {
        "id": 2,
        "name": "李四",
        "pid": 1,
        "children": [
          {
            "id": 3,
            "name": "王五",
            "pid": 2,
            "children": [
              {
                "id": 4,
                "name": "赵六",
                "pid": 3,
                "children": [
                  {
                    "id": 5,
                    "name": "陈七",
                    "pid": 4
                  },
                  {
                    "id": 6,
                    "name": "谢八",
                    "pid": 4
                  }
                ]
              },
              {
                "id": 8,
                "name": "杨二",
                "pid": 3
              }
            ]
          }
        ]
      },
      {
        "id": 7,
        "name": "林一",
        "pid": 1
      }
    ]
  }
]

迭代实现

javascript">const buildTree = (root) => {
  const hash = {};
  const tree = [];
  root.forEach((node) => {
    hash[node.id] = node;
  });
  root.forEach((node) => {
    const parent = hash[node.pid];
    if (parent) {
      (parent.children || (parent.children = [])).push(node);
    } else {
      tree.push(hash[node.id]);
    }
  });
  return tree;
}
const tree = buildTree(source);
console.log(JSON.stringify(tree, null, 2));

递归实现

const buildTree = (root, pid = 0) => {
  const tree = [];
  for (const node of root) {
    if (node.pid === pid) {
      const children = buildTree(root, node.id);
      if (children.length) {
        node.children = children;
      }
      tree.push(node);
    }
  }
  return tree;
};
const tree = buildTree(source);
console.log(JSON.stringify(tree, null, 2));

二、树形结构拍平

// 展平树状数组
const node = {
  id: 0,
  parentId: null,
  name: "生物",
  children: [
    {
      id: 1,
      parentId: 0,
      name: "动物",
      children: [
        {
          id: 4,
          parentId: 1,
          name: "哺乳动物",
          children: [
            {
              id: 8,
              parentId: 4,
              name: "大象",
            },
            {
              id: 9,
              parentId: 4,
              name: "海豚",
            },
            {
              id: 10,
              parentId: 4,
              name: "猩猩",
            },
          ],
        },
        {
          id: 5,
          parentId: 1,
          name: "卵生动物",
          children: [
            {
              id: 11,
              parentId: 5,
              name: "蟒蛇",
            },
            {
              id: 12,
              parentId: 5,
              name: "麻雀",
            },
          ],
        },
      ],
    },
    {
      id: 2,
      parentId: 0,
      name: "植物",
      children: [
        {
          id: 6,
          parentId: 2,
          name: "种子植物",
          children: [
            {
              id: 111,
              parentId: 6,
              name: "种子植物的孩子1",
            },
            {
              id: 112,
              parentId: 6,
              name: "种子植物的孩子2",
            },
          ],
        },
        {
          id: 7,
          parentId: 2,
          name: "蕨类植物",
        },
      ],
    },
    {
      id: 3,
      parentId: 0,
      name: "微生物",
    },
  ],
};
// 展平
[
  { id: 0, parentId: null, name: "生物" },
  { id: 1, parentId: 0, name: "动物" },
  { id: 2, parentId: 0, name: "植物" },
  { id: 3, parentId: 0, name: "微生物" },
  { id: 4, parentId: 1, name: "哺乳动物" },
  { id: 5, parentId: 1, name: "卵生动物" },
  { id: 6, parentId: 2, name: "种子植物" },
  { id: 7, parentId: 2, name: "蕨类植物" },
  { id: 8, parentId: 4, name: "大象" },
  { id: 9, parentId: 4, name: "海豚" },
  { id: 10, parentId: 4, name: "猩猩" },
  { id: 11, parentId: 5, name: "蟒蛇" },
  { id: 12, parentId: 5, name: "麻雀" },
  { id: 111, parentId: 6, name: "种子植物的孩子1" },
  { id: 112, parentId: 6, name: "种子植物的孩子2" },
];
const treeToFlat = (root) => {
  let res = [];
  let queue = [root];
  while (queue.length) {
    const node = queue.shift();
    res.push({
      id: node.id,
      parentId: node.parentId,
      name: node.name,
    });
    if (node.children) {
      for (const child of node.children) {
        queue.push(child);
      }
    }
  }
  return res;
};

console.log(treeToFlat(node));

http://www.niftyadmin.cn/n/4996836.html

相关文章

【高效编程技巧】编程菜鸟和编程大佬的差距究竟在哪里?

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《高效编程技巧》《C语言进阶》 ⛺️生活的理想,就是为了理想的生活! 文章目录 📋 前言1.如何写出好的代码?1.2 如何分析一个函数写的怎么样 2. 代码板式的重要性2.1 代码…

NAT与代理服务器

1.DNS Domain Name System 是一整套从域名映射到IP的系统(把域名转化为IP地址) 2.域名简介 3.周鸿祎 傅盛 4.ICMP协议 用来网络故障排查原因 草图理解“位置” ping ICMP 是绕过TCP UDP传输协议的,没有端口号 traceroute 5.NAT技术 N…

SQL Server对象类型(3)——视图(View)

1. 视图概念 与Oracle中的视图类似,SQL Server中的视图也是一种虚的、通过一个查询定义的逻辑对象,主要用于集中、简化、定制用户需求,控住其底层表安全,以及应用系统提供向后兼容等方面。 --注: 1)上述内容中的“虚的”,表示视图本身并不实际包含和存储数据,SQL Ser…

leetcode 724. 寻找数组的中心下标

2023.9.3 本题先 求出数组总和sum&#xff0c;再寻找数组的中心下标&#xff1a;if(sum - temp -nums[i] temp) return i; 代码如下&#xff1a; class Solution { public:int pivotIndex(vector<int>& nums) {//求数组元素总和int sum 0; for(int num : nums…

sqlserver 自定义函数汉字转拼音或首字母

作用&#xff1a; 将汉字生成为全拼音或者首字母&#xff0c;示例 执行自定义函数&#xff0c;将汉字转成对应的首字母 执行自定义函数&#xff0c;将汉字转成全拼音 自定义教程&#xff1a; 一&#xff0c;只取汉字的首字母 代码如下&#xff1a; 执行下面sql 就自定义函数了…

Conda环境配置常用

常用命令 pip list 查看pip安装的包 conda list pip show numpy 查看包的详细信息 Conda环境配置 conda env list 查看已有的虚拟环境 conda activate my_test 切换到想要的虚拟环境 conda activate 激活canda环境 python -V #注意V是大写&#xff0c;即可查看Pytho…

java并发编程 ArrayBlockingQueue详解

文章目录 前言1 ArrayBlockingQueue是什么2 核心属性详解3 核心方法详解3.1 add(E e)3.2 offer(E e)3.3 put(E e)3.4 take()3.5 poll()3.6 peek()3.7 size()3.8 remove(Object o)3.9 contains(Object o)3.10 drainTo(Collection<? super E> c, int maxElements) 4 总结 …

分布式session的4种解决方案

分布式session的4种解决方案 1、cookie和session cookie和session都是用来跟踪用户身份信息的会话方式。 cookie存储的数据保存在本地客户端&#xff0c;用户获取容易&#xff0c;但安全性不高&#xff0c;存储数据小。 session存储的数据保存在服务器&#xff0c;用户不易获取…