当前位置: 首页 > article >正文

el-table树形表格合并相同的值

el-table树形表格合并相同的值

  • el-table树形表格合并相同的值
  • 让Ai进行优化后的代码

在这里插入图片描述

el-table树形表格合并相同的值

<style lang="scss" scoped>
.tableBox {/deep/ &.el-table th:first-child,/deep/ &.el-table td:first-child {padding-left: 0;}
}
</style>
<template><div><el-tableclass="tableBox"row-key="uniID"ref="refTable":data="tableData"style="width: 100%"border:span-method="arraySpanMethod":tree-props="{ children: 'children', hasChildren: 'hasChildren' }"><el-table-column prop="dateTime" label="时间" key="dateTime" min-width="140"><template slot-scope="{ row }">{{ row.groupNo ? findValue(row.groupNo, groupNoList) : row.dateTime }}</template></el-table-column><el-table-column prop="yieldConsume" label="产量(t)" key="yieldConsume" min-width="110" /></el-table></div>
</template><script lang="ts">
import { Component, Vue } from 'vue-property-decorator';interface TableRow {uniID: number;dateTime: string;groupNo: number | null;yieldConsume: number;children?: TableRow[];parent?: TableRow | null;
}@Component({})
export default class EnergyAnalysis extends Vue {private tableData: TableRow[] = [];private groupNoList: any = [{value: '甲',key: 1,},{value: '乙',key: 2,},{value: '丙',key: 3,},{value: '丁',key: 4,},];private testData = {data: {everyDetail: [{dateTime: '2025-03-01',groupNo: null,yieldConsume: -30176.691,children: [{dateTime: '2025-03-01',groupNo: 1,yieldConsume: 100,children: null,},{dateTime: '2025-03-01',groupNo: 1,yieldConsume: -18885.714,children: null,},{dateTime: '2025-03-01',groupNo: 2,yieldConsume: 100,children: null,},{dateTime: '2025-03-01',groupNo: 2,yieldConsume: 101,children: null,},{dateTime: '2025-03-01',groupNo: 2,yieldConsume: 102,children: null,},],},{dateTime: '2025-03-02',groupNo: null,yieldConsume: -30176.691,children: [{dateTime: '2025-03-02',groupNo: 1,yieldConsume: 111,children: null,},],},],},};created() {this.statisticsQuery();}private findValue(data: any, list: any) {const a = list.find((el: any) => el.key === data);return a ? a.value : '-';}private async statisticsQuery() {let index = 1;// 递归函数将原始数据转换为包含父子关系的TableRow对象数组const recursionList = (list: any[], parent: TableRow | null = null): TableRow[] => {return list?.map((v: any) => {const newRow: TableRow = {...v,uniID: index++,parent: parent,};if (v.children) {newRow.children = recursionList(v.children, newRow);}return newRow;});};const data = this.testData;// 处理成表格所需的格式this.tableData = recursionList(data.data?.everyDetail);this.$nextTick(() => {(this.$refs as any).refTable.doLayout();});}/*** arraySpanMethod 方法用于定义表格中的单元格合并规则。* 此方法接收一个参数,该参数包含当前行和列的信息,包括 row、column、rowIndex 和 columnIndex。** @param {Object} param - 包含当前行和列信息的对象。* @param {TableRow} param.row - 当前行的数据对象。* @param {VueTableColumn} param.column - 当前列的信息对象。* @param {number} param.rowIndex - 当前行的索引。* @param {number} param.columnIndex - 当前列的索引。** 此方法特别处理了第一列(即时间列)的单元格合并逻辑:* 如果当前行的 `groupNo` 不为空,则检查其是否与兄弟节点有相同的 `groupNo` 值,* 若相同则进行单元格合并。否则返回默认的合并值(即不合并)。*/private arraySpanMethod({ row, column, rowIndex, columnIndex }: any) {// 仅对第一列应用合并逻辑if (columnIndex === 0) {// 如果当前行有 `groupNo` 值if (row.groupNo != null) {const parent = row.parent; // 获取父级数据对象if (parent && parent.children) {// 确保存在父级及子节点列表const siblings = parent.children; // 子节点列表const currentIndex = siblings.findIndex((sib: TableRow) => sib.uniID === row.uniID); // 查找当前行在子节点列表中的位置// 如果找不到当前行的位置,则直接返回默认合并值if (currentIndex === -1) return [1, 1];let count = 1; // 初始化计数器,用于计算需要合并的单元格数量// 遍历后续的兄弟节点,查找具有相同 `groupNo` 的连续单元格for (let i = currentIndex + 1; i < siblings.length; i++) {if (siblings[i].groupNo === row.groupNo) {count++; // 相同 `groupNo` 则计数器加一} else {break; // 遇到不同的 `groupNo` 则停止计数}}// 如果当前行不是第一个具有该 `groupNo` 的行,则不显示此行if (currentIndex > 0 && siblings[currentIndex - 1].groupNo === row.groupNo) {return { rowspan: 0, colspan: 0 }; // 返回0表示不渲染该单元格} else {// 否则,根据计算出的连续相同 `groupNo` 单元格的数量返回合并值return { rowspan: count, colspan: 1 };}}} else {// 对于没有 `groupNo` 的行,返回默认合并值return { rowspan: 1, colspan: 1 };}}// 默认情况下,所有其他列不进行单元格合并return { rowspan: 1, colspan: 1 };}
}
</script>

让Ai进行优化后的代码

注意:以下为Ai生成,暂未测试性能内存等是否真的进行了优化

<style lang="scss" scoped>
.tableBox {/deep/ &.el-table th:first-child,/deep/ &.el-table td:first-child {padding-left: 0;}
}
</style>
<template><div><el-tableclass="tableBox"row-key="uniID"ref="refTable":data="tableData"style="width: 100%"border:span-method="arraySpanMethod":tree-props="{ children: 'children', hasChildren: 'hasChildren' }"><el-table-column prop="dateTime" label="时间" key="dateTime" min-width="140"><template slot-scope="{ row }">{{ row.groupNo ? findValue(row.groupNo, groupNoList) : row.dateTime }}</template></el-table-column><el-table-column prop="yieldConsume" label="产量(t)" key="yieldConsume" min-width="110" /></el-table></div>
</template><script lang="ts">
import { Component, Vue } from 'vue-property-decorator';interface TableRow {uniID: number;dateTime: string;groupNo: number | null;yieldConsume: number;children?: TableRow[];parent?: TableRow | null;// 新增预处理字段spanInfo?: {rowspan: number;hidden: boolean;};
}@Component({})
export default class EnergyAnalysis extends Vue {private tableData: TableRow[] = [];private groupNoList: any = [{value: '甲',key: 1,},{value: '乙',key: 2,},{value: '丙',key: 3,},{value: '丁',key: 4,},];private testData = {data: {everyDetail: [{dateTime: '2025-03-01',groupNo: null,yieldConsume: -30176.691,children: [{dateTime: '2025-03-01',groupNo: 1,yieldConsume: 100,children: null,},{dateTime: '2025-03-01',groupNo: 1,yieldConsume: -18885.714,children: null,},{dateTime: '2025-03-01',groupNo: 2,yieldConsume: 100,children: null,},{dateTime: '2025-03-01',groupNo: 2,yieldConsume: 101,children: null,},{dateTime: '2025-03-01',groupNo: 2,yieldConsume: 102,children: null,},],},{dateTime: '2025-03-02',groupNo: null,yieldConsume: -30176.691,children: [{dateTime: '2025-03-02',groupNo: 1,yieldConsume: 111,children: null,},],},],},};created() {this.statisticsQuery();}private findValue(data: any, list: any) {const a = list.find((el: any) => el.key === data);return a ? a.value : '-';}private async statisticsQuery() {let index = 1;const recursionList = (list: any[], parent: TableRow | null = null): TableRow[] => {return list?.map((v: any) => {const newRow: TableRow = {...v,uniID: index++,parent: parent,spanInfo: { rowspan: 1, hidden: false }, // 初始化合并信息};// 预处理子节点的合并信息if (newRow.children) {newRow.children = recursionList(newRow.children, newRow);this.preCalculateSpan(newRow.children); // 关键优化点}return newRow;});};const data = this.testData;this.tableData = recursionList(data.data?.everyDetail);this.$nextTick(() => {(this.$refs as any).refTable.doLayout();});}/*** 预处理合并信息 (核心优化逻辑)* @param children - 子节点列表,包含需要进行合并处理的行数据。*/preCalculateSpan(children: TableRow[]) {let pos = 0; // 当前处理的位置指针while (pos < children.length) {// 遍历所有子节点const current = children[pos]; // 当前处理的行if (current.groupNo == null) {// 如果当前行没有组编号,则跳过pos++;continue;}// 向后查找相同 groupNo 的数量let sameCount = 1; // 初始化相同组编号的数量为1(包括当前行)for (let i = pos + 1; i < children.length; i++) {// 从下一个元素开始查找if (children[i].groupNo === current.groupNo) {// 如果发现相同组编号sameCount++; // 增加计数} else {break; // 一旦遇到不同的组编号,停止查找}}// 更新合并信息current.spanInfo = { rowspan: sameCount, hidden: false }; // 设置当前行为合并起始行for (let j = pos + 1; j < pos + sameCount; j++) {// 对于后续的相同组编号的行children[j].spanInfo = { rowspan: 0, hidden: true }; // 标记这些行为隐藏状态,不需要显示}pos += sameCount; // 移动位置指针,跳过已处理的行}}/*** 合并方法直接使用预处理结果* @param param - 包含 row(当前行数据)、column(当前列配置)、columnIndex(当前列索引)的对象。* @returns 返回一个对象,指定当前单元格的 rowspan 和 colspan。*/arraySpanMethod({ row, column, columnIndex }: any) {// 只对第一列应用合并规则if (columnIndex === 0 && row.spanInfo) {return {rowspan: row.spanInfo.rowspan, // 根据预处理结果设置行跨度colspan: row.spanInfo.hidden ? 0 : 1, // 如果该行被标记为隐藏,则设置 colspan 为 0};}// 默认情况下,每个单元格的 rowspan 和 colspan 都为 1return { rowspan: 1, colspan: 1 };}
}
</script>

在这里插入图片描述
在这里插入图片描述

相关文章:

el-table树形表格合并相同的值

el-table树形表格合并相同的值 el-table树形表格合并相同的值让Ai进行优化后的代码 el-table树形表格合并相同的值 <style lang"scss" scoped> .tableBox {/deep/ &.el-table th:first-child,/deep/ &.el-table td:first-child {padding-left: 0;} } …...

Apache Tomcat漏洞,对其进行升级

我们付出一些成本&#xff0c;时间的或者其他&#xff0c;最终总能收获一些什么。 升级背景&#xff1a; 近日&#xff0c;新华三盾山实验室监测到 Apache 官方修复了一个远程代码执行漏洞 (CVE-2025-24813) &#xff0c;其CVSS3 漏洞评分为 7.5 。 影响范围 9.0.0.M1 ≤…...

工程实践:如何使用SU17无人机来实现室内巡检任务

阿木实验室最近发布了科研开发者版本的无人机SU17&#xff0c;该无人机上集成了四目视觉&#xff0c;三维激光雷达&#xff0c;云台吊舱&#xff0c;高算力的机载计算机&#xff0c;是一个非常合适的平台用于室内外巡检场景。同时阿木实验室维护了多个和无人机相关的开源项目。…...

时序优化学习笔记

0.代码对应的底层调用 if-else的判定条件需要LUT实现&#xff0c;累加器的进位需要靠CARRY实现。 1.逻辑级数的概念 简单来讲就是组合逻辑串联的个数 逻辑级数查询命令 report_design_analysis -logic_level_distribution -logic_level_dist_paths 5000 -name design_analy…...

OSPF-3 1类LSA Router LSA

前面两期我们介绍了OSPF的邻居与邻接建立的关系及失败因素和原因 这章我们来说说OSPF是如何通过不同的LSA去描述拓扑的信息以及路由信息 一、概述 OSPF通过不同的LSA来构成LSDB链路状态数据库,再通过SPF算法来计算出最优的最短路径 二、LSA的分类 类型名称描述传播范围1类…...

纳米压印技术制备AR眼镜的参考步骤

纳米压印技术&#xff08;Nanoimprint Lithography, NIL&#xff09;在 AR&#xff08;增强现实&#xff09;眼镜中的应用主要集中在光学元件的制造上&#xff0c;例如衍射光栅、波导和微透镜阵列等。以下是使用纳米压印技术制备 AR 眼镜光学元件的详细步骤&#xff1a; 1. 设…...

FX-std::list

std::list 是 C 标准库中的一个双向链表容器&#xff0c;定义在 <list> 头文件中。它支持在任意位置高效地插入和删除元素&#xff0c;但不支持随机访问。以下是 std::list 的基本用法和一些常见操作&#xff1a; 1. 包含头文件 #include <list> 2. 定义和初始化…...

【清华大学第七版】DeepSeek赋能家庭教育的实操案例(批改作文+辅助语文/数学/科学学习+制定学习计划)

我用夸克网盘分享了「DeepSeek完整资料合集」&#xff0c;点击链接即可保存。打开「夸克APP」&#xff0c;无需下载在线播放视频&#xff0c;畅享原画5倍速&#xff0c;支持电视投屏。 链接&#xff1a;https://pan.quark.cn/s/621259e4af15 近日&#xff0c;清华大学发布了《…...

HCIA-ACL实验

前提条件&#xff1a;实现底层互通 转发层面 1、基本ACL ①要求PC3不能访问网段192.168.2.0的网段&#xff0c;PC4和客户端能正常访问服务器 ②AR2配置 acl 2000 rule deny source 192.168.1.1 0 匹配流量 int g 0/0/0 traffic-filter inbound acl 2000 接口调用…...

【Gee】项目总结:模仿 GIN 实现简单的 Golang Web 框架

文章目录 Gee 项目回顾Gee 项目总结Golang 已经具备基础的 web 功能&#xff0c;为什么还需要 web 框架&#xff1f;作为 web 框架&#xff0c;Gee 框架完成了哪些功能&#xff1f;如何用 Gee 来构建 web 项目&#xff1f; Gee 项目回顾 上个月月末我按照 Geektutu 的教程&…...

DeepLabv3+改进10:在主干网络中添加LSKBlock|动态调整其大型空间感受野,助力小目标识别

🔥【DeepLabv3+改进专栏!探索语义分割新高度】 🌟 你是否在为图像分割的精度与效率发愁? 📢 本专栏重磅推出: ✅ 独家改进策略:融合注意力机制、轻量化设计与多尺度优化 ✅ 即插即用模块:ASPP+升级、解码器 PS:订阅专栏提供完整代码 目录 论文简介 步骤一 步骤二…...

词向量:优维大模型语义理解的深度引擎

★ 放闸溯源 优维大模型「骨架级」技术干货 第二篇 ⇓ 词向量是Transformer突破传统NLP技术瓶颈的核心&#xff0c;它通过稠密向量空间映射&#xff0c;将离散符号转化为连续语义表示。优维大模型基于词向量技术&#xff0c;构建了运维领域的“语义地图”&#xff0c;实现从…...

编译原理:语法分析程序【附源码和超详细注释】

目录 一 、实验目的 二 、实验内容及步骤 三、程序分析 1. 需求分析 2. 功能分析 1. LL(1)文法功能分析 2. 算符优先文法功能分析 3. 信创分析-主要针对能力提升中国产操作系统上开发内容。 四、源代码 1. LL(1)文法代码 2. 算符优先文法 五、测试结果 1. LL(1)文…...

Go vs Rust vs C++ vs Python vs Java:谁主后端沉浮

一、核心性能对比(基于TechEmpower基准测试) 语言单核QPS延迟(ms)内存消耗适用场景Rust650,0000.1245MB高频交易/区块链C++720,0000.0932MB游戏服务器/实时渲染Go230,0000.45110MB微服务/API网关Java180,0001.2450MB企业ERP/银行系统Python12,0008.5220MBAI接口/快速原型技术…...

使用Flask和OpenCV 实现树莓派与客户端的视频流传输与显示

使用 Python 和 OpenCV 实现树莓派与客户端的视频流传输与显示 在计算机视觉和物联网领域&#xff0c;经常需要将树莓派作为视频流服务器&#xff0c;通过网络将摄像头画面传输到客户端进行处理和显示。本文将详细介绍如何利用picamera2库、Flask 框架以及 OpenCV 库&#xff…...

fs的proxy_media模式失效

概述 freeswitch是一款简单好用的VOIP开源软交换平台。 在fs的使用过程中&#xff0c;某些场景只需要对rtp媒体做透传&#xff0c;又不需要任何处理。 在fs1.6的版本中&#xff0c;我们可以使用proxy_media来代理媒体的转发&#xff0c;媒体的协商由AB路端对端处理&#xff…...

Linux 命名管道

文章目录 &#x1f680; 深入理解命名管道&#xff08;FIFO&#xff09;及其C实现一、命名管道核心特性1.1 &#x1f9e9; 基本概念 二、&#x1f4bb; 代码实现解析2.1 &#x1f4c1; 公共头文件&#xff08;common.hpp&#xff09;2.2 &#x1f5a5;️ 服务器端&#xff08;s…...

HDU 学数数导致的

题目解析 首先&#xff0c;数对是有序的&#xff0c;<1,2>和<2,1>被视为不同的两组数字。 其次&#xff0c;数对<p,q>的p和q可以相等。 子序列为 p 0 p q&#xff0c;观察到&#xff0c;中间要出现一个0。那么&#xff0c;我们只需要找到第一个 p 满足与前…...

pjsip pjsua_media_config 结构体说明

clock_rate 描述:设置会议桥(conference bridge)的时钟频率(采样率)。 默认值:0(使用默认值 PJSUA_DEFAULT_CLOCK_RATE,通常为 16kHz)。 作用:影响音频的采样率,常见值有 8000(8kHz)、16000(16kHz)、48000(48kHz)等。snd_clock_rate 描述:设置音频设备的时钟…...

软件/硬件I2C读写MPU6050

MPU6050简介 6轴&#xff1a;3轴加速度&#xff0c;3轴角速度 9轴&#xff1a;3轴加速度&#xff0c;3轴角速度和3轴磁场强度 10轴&#xff1a;3轴加速度&#xff0c;3轴角速度和3轴磁场强度和一个气压强度 加速度计具有静态稳定性&#xff0c;不具有动态稳定性 欧拉角&…...

c++ union使用笔记

c union使用笔记 一、联合的简单使用二、联合与枚举结合三、匿名联合&#xff08;Anonymous Union&#xff09;四、关键注意事项五、C17 扩展&#xff1a;std::variant C联合&#xff08;union&#xff09;是一种特殊的数据结构&#xff0c;允许在相同内存位置存储不同的数据类…...

Android中的Wifi框架系列

Android wifi框架图 Android WIFI系统引入了wpa_supplicant&#xff0c;它的整个WIFI系统以wpa_supplicant为核心来定义上层接口和下层驱动接口。 Android WIFI主要分为六大层&#xff0c;分别是WiFi Settings层&#xff0c;Wifi Framework层&#xff0c;Wifi JNI 层&#xff…...

react(一):特点-基本使用-JSX语法

初识React React是一个用于构建用户界面的 JavaScript 库&#xff0c;由 Facebook 开发和维护。 官网文档&#xff1a;React 官方中文文档 特点 1.声明式编程 2.组件化开发 3.多平台适配 开发依赖 开发React必须依赖三个库&#xff1a; 1.react&#xff1a;包含react所必…...

【Go】无法访问 proxy.golang.org 进行依赖下载

golang.org/x/net/context: golang.org/x/netv0.37.0: Get "https://proxy.golang.org/golang.org/x/net/v/v0.37.0.zip": dial tcp 142.251.215.241:443: connect: connection refused解决方案&#xff1a; 使用国内的 Go 代理&#xff0c;如 goproxy.cn 或 gopro…...

鸿蒙 @ohos.arkui.observer (无感监听)

鸿蒙 ohos.arkui.observer (无感监听) 在鸿蒙开发中&#xff0c;ohos.arkui.observer 模块提供了一种强大的无感监听机制&#xff0c;允许开发者监听组件的状态变化、滚动事件、页面切换等事件。这些功能对于实现复杂的交互逻辑和优化性能非常有帮助。本文将详细介绍 ohos.ark…...

一键爬取b站视频

同学们。废话不多说&#xff0c; b站视频素材多&#xff0c; 二次加工就归你&#xff0c; 三话不说爬起来&#xff0c; 犯法违纪咱不干 代码 import json import requests from bs4 import BeautifulSoup import re# 目标网址bvnane"BV1hUQEYCEyY" pp("0&q…...

【含文档+PPT+源码】基于Python的图书管理系统的设计与实现

项目介绍 本课程演示的是一款基于Python的图书管理系统的设计与实现&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 包含&#xff1a;项目源码、项目文档、数据库脚本、软件工具等所有资料 带你从零开始部署运行本套系统 该项目附…...

开源工具利器:Mermaid助力知识图谱可视化与分享

在现代 web 开发中&#xff0c;可视化工具对于展示流程、结构和数据关系至关重要。Mermaid 是一款强大的 JavaScript 工具&#xff0c;它使用基于 Markdown 的语法来呈现可定制的图表、图表和可视化。对于展示流程、结构和数据关系至关重要。通过简单的文本描述&#xff0c;你可…...

Mysql的utf8mb4_general_ci 与 utf8mb4_bin 的具体区别是什么?中文适合哪个?

1. utf8mb4_general_ci vs utf8mb4_bin 的具体区别 utf8mb4_general_ci 和 utf8mb4_bin 都是 utf8mb4 编码的排序规则&#xff08;collation&#xff09;&#xff0c;它们主要在 排序&#xff08;ORDER BY&#xff09; 和 比较&#xff08;WHERE&#xff09; 时的行为不同&…...

茂捷M1001电感式编码器芯片TSSOP28管脚,国产电感式编码器IC

简述&#xff1a; M1001 电感式编码器芯片是一款专为高精度位置检测而设计的芯片产品&#xff0c;采用先进的电感技术&#xff0c;能够精确测量旋转物体的位置和角度。芯片具有 SIN/COS、模拟、PWM、SENT、SPI、I2C等多种角度输出功能&#xff0c;具有高分辨率、宽工作温度范围…...