React将数据转化成树形结构

news/2024/7/15 19:20:06 标签: react.js, 前端, javascript

1、React将数据转化成树形结构

javascript">
// 初始数据
let result = [
  { parentId: null, id: 1, name: "书籍", count: 100 },
  { parentId: 1, id: 2, name: "西游记", count: 50 },
  { parentId: 1, id: 3, name: "红楼梦", count: 10 },
  { parentId: 1, id: 4, name: "水浒传", count: 20 },
  { parentId: 1, id: 5, name: "三国演义", count: 20 },
  { parentId: null, id: 6, name: "文具", count: 10 },
  { parentId: 6, id: 7, name: "铅笔", count: 5 },
  { parentId: 6, id: 8, name: "橡皮", count: 5 },
];

const getTreeData = (treeData, parentId) => {
  // 把数据转化为树型结构
  let tree = [];
  let currentParentId = parentId || null;
  for (let i = 0; i < treeData.length; i += 1) {
    if (treeData[i]) {
      if (treeData[i].parentId === currentParentId) {
        tree.push(treeData[i]);
      }
    }
  }
  for (let j = 0; j < tree.length; j += 1) {
    if (tree[j]) {
      let children = getTreeData(treeData, tree[j].id);
      if (children && children.length) {
        tree[j].children = children;
      }
    }
  }
  return tree;
};

// 树形数据
let data = getTreeData(result);
console.log(data);
/*[
    {
        parentId: null,
        id:1,
        name:'书籍',
        count:100,
        children:[
            {parentId:1,id:2,name:'西游记',count: 50},
            {parentId:1,id:3,name:'红楼梦',count: 10},
            {parentId:1,id:4,name:'水浒传',count: 20},
            {parentId:1,id:5,name:'三国演义',count: 20},
        ]
    },
    {
        parentId: null,
        id:6,
        name:'文具',
        count:10,
        children:[
            {parentId:6,id:7,name:'铅笔',count:5},
            {parentId:6,id:8,name:'橡皮',count:5},
        ]
    }
]*/

2、实例(react antd table树形数据)

线上地址:react antd table 树形结构数据

javascript">
import React, { useState, useEffect } from 'react';
import { Table } from 'antd';

const Test = () => {
  const [expandedRowKeys, setExpandedRowKeys] = useState([]);
  const [dataSource, setDataSource] = useState([]);
  const columns = [
    {
      title: '名称',
      key: 'name',
      dataIndex: 'name',
    },
    {
      title: '描述',
      key: 'desc',
      dataIndex: 'desc',
    },
  ];
  const onExpandTable = (expanded, record) => {
    let arr = expandedRowKeys;
    if (expanded) {
      arr.push(record.id);
    } else {
      arr.splice(
        arr.findIndex((i) => i === record.id),
        1
      );
    }
    setExpandedRowKeys(arr);
  };

  const getTreeData = (treeData, parentId) => {
    // 把数据转化为树型结构
    let tree = [];
    let currentParentId = parentId || null;
    for (let i = 0; i < treeData.length; i += 1) {
      if (treeData[i]) {
        if (treeData[i].parentId === currentParentId) {
          tree.push(treeData[i]);
        }
      }
    }
    for (let j = 0; j < tree.length; j += 1) {
      if (tree[j]) {
        let children = getTreeData(treeData, tree[j].id);
        if (children && children.length) {
          tree[j].children = children;
        }
      }
    }
    return tree;
  };

  useEffect(() => {
    const res = [
      {
        parentId: null,
        id: '0e02f058-65fc-4e47-82d5-3aaf95f816cd',
        name: '中国',
        desc: '中国陆地面积约9600000平方千米',
      },
      {
        parentId: '0e02f058-65fc-4e47-82d5-3aaf95f816cd',
        id: '03014a12-3948-4f8a-b182-ed8b6d58a7ea',
        name: '四川',
        desc: '四川地域面积约486000平方公里',
      },
      {
        parentId: '0e02f058-65fc-4e47-82d5-3aaf95f816cd',
        id: '201f9c09-f2e8-4bea-917e-b5fdc56d9e24',
        name: '山东',
        desc: '陆域面积约155800平方公里',
      },
      {
        parentId: '03014a12-3948-4f8a-b182-ed8b6d58a7ea',
        id: '305d7648-9e3e-4b25-a246-3be08344434e',
        name: '成都',
        desc: '成都地域面积约14335平方公里',
      },
      {
        parentId: '201f9c09-f2e8-4bea-917e-b5fdc56d9e24',
        id: '3898961f-7487-46d6-8595-f2dfac59b116',
        name: '济南',
        desc: '济南地域面积约10244.45平方公里',
      },
    ];
    let data = getTreeData(res);
    console.log('data: ', data);
    setDataSource(data);
  }, []);
  return (
    <>
      <Table
        columns={columns}
        dataSource={dataSource}
        rowKey={(record) => record.id}
        expandedRowKeys={expandedRowKeys}
        onExpand={onExpandTable}
        pagination={false}
      />
    </>
  );
};

export default Test;


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

相关文章

Linux使用cp命令报cp:omitting directory错误

当我们拷贝文件夹的时候如 cp test test01 会报下面这个错误 cp: omitting directory ‘test’ 这是因为文件夹里面还存在文件夹 我们在使用命令时候加上 -r 参数即可 cp -r test test01

Kafka常用操作命令

1.启动Kafka&#xff0c; 其中">>/dev/null"表示将日志信息输出到"黑洞"&#xff0c; 其中"2>&1"表示将错误信息和前面的日志信息一样&#xff0c;也输出到"黑洞"&#xff0c; 末尾的"&"表示以后台方式启动…

Javaweb总结1—在porperties文件里获取JDBC连接属性

今天来分享一下使用porperties配置文件和JDBC的联合使用 JDBC&#xff1a; 在我们平时连接数据库时&#xff0c;一般都是通过JDBC来进行连接&#xff0c;接下来是JDBC连接的步骤和代码演示。&#xff08;大致步骤&#xff0c;需要运行的话加上自己的信息和所用的环境&#xff0…

Kafka的快速使用

Kafka使用到了zookeeper&#xff0c;所以首先你得安装zookeeper再安装kafka。 1.单节点的broker部署 首先我们需要修改$KAFKA_HOME/config/server.properties这个配置文件&#xff0c;主要以下几处需要修改&#xff1a; broker.id0&#xff0c;#每个broker的ID需要唯一 liste…

Javaweb总结2—自定义JDBC数据库连接池

什么是数据库连接池呢&#xff1f; 数据库连接池简而言之就是一个容器里存放一些数据库连接。 那问题来了&#xff0c;要数据库连接池有什么用呢&#xff1f; 哈哈不用急&#xff0c;接下来我们一起慢慢分析分析 我们仔细观察这个连接池&#xff0c;有没有解决刚刚开始的疑问呢…

SpringBoot 学习系列(九) - linux下用Docker部署Spring Boot

Spring Boot 项目添加 Docker 支持 在 pom.xml-properties 中添加 Docker 镜像名称 <properties><docker.image.prefix>springboot</docker.image.prefix> </properties>plugins 中添加 Docker 构建插件&#xff1a; <build><plugins>&…

设计模式之装饰者模式大概思想

什么是装饰者模式呢&#xff0c;为什么要用装饰者模式&#xff0c;用了会有什么好处呢&#xff1f; 那么下来我给大家介绍一下什么是装饰者模式&#xff1a; 装饰者模式见名知意就是给前面写的东西装饰一下&#xff0c;让它变成对我们最有用的一方面&#xff0c;在面向接口编程…

JavaWeb总结三—C3P0的使用(史上最简)

我配置一些东西时经常看到一些很繁琐的配置&#xff0c;我喜欢简简单单&#xff0c;因此我给出我成功配置的全过程。 c3p0配置步骤&#xff1a; 1.导入c3p0的依赖&#xff08;或者包&#xff09;&#xff1a;两个包c3p0和数据库连接的包 2.在xml中配置c3p0&#xff0c;xml名必须…