基于iview.viewUI实现行合并(无限制/有限制合并)【已验证可正常运行】

1.基于iview.viewUI实现行合并(列之间没有所属对应关系,正常合并)

在这里插入图片描述

注:以下代码来自于GPT4o:国内直连GPT4o

只需要修改以下要合并的列字段,就可以方便使用啦

mergeFields: ['majorNo', 'devNam', 'overhaulAdvice', 'level']
<template><div style="margin-top:200px"><Table :columns="columns14" :data="data5" border :span-method="handleSpan"></Table></div>
</template><script>
export default {data() {return {columns14: [{title: '序号',key: 'index'},{title: '专业名称',key: 'majorNo'},{title: '设备名称',key: 'devNam'},{title: '检修建议',key: 'overhaulAdvice'},{title: '综合评价等级',key: 'level'}],resData: [{id: '1',devNam: 'CVS设备',overhaulAdvice: "异常说明",level: '未见异常',majorNo: '风电',index: 1},{id: '2',devNam: 'CVS设备',overhaulAdvice: "异常说明",level: '未见异常',majorNo: '风电',index: 2},{id: '3',devNam: '设备1',overhaulAdvice: "异常说明",level: '未见异常',majorNo: '锅炉、风电',index: 3},{id: '4',devNam: '设备1',overhaulAdvice: "异常说明",level: '未见异常',majorNo: '锅炉、风电',index: 4},{id: '5',devNam: 'CVS设备1',overhaulAdvice: "异常说明",level: '未见异常',majorNo: '锅炉',index: 5},],data5: [],mergeFields: ['majorNo', 'devNam', 'overhaulAdvice', 'level']};},methods: {// 合并单元格的处理方法handleSpan({ row, column, rowIndex, columnIndex }) {const mergeField = this.columns14[columnIndex].key;const mergeKey = `merge${mergeField.charAt(0).toUpperCase() + mergeField.slice(1)}`;if (this.mergeFields.includes(mergeField)) {return [row[mergeKey], row[mergeKey] ? 1 : 0];}},// 组装数据以便处理合并单元格assembleData(data) {const mergeData = {};this.mergeFields.forEach(field => {mergeData[field] = {};data.forEach(row => {const fieldValue = row[field];if (!mergeData[field][fieldValue]) {mergeData[field][fieldValue] = [];}mergeData[field][fieldValue].push(row);});});const mergeCounts = {};Object.keys(mergeData).forEach(field => {mergeCounts[field] = {};Object.keys(mergeData[field]).forEach(key => {mergeCounts[field][key] = mergeData[field][key].length;});});const fieldIndex = {};data.forEach(row => {this.mergeFields.forEach(field => {const mergeKey = `merge${field.charAt(0).toUpperCase() + field.slice(1)}`;if (!fieldIndex[field]) {fieldIndex[field] = {};}if (!fieldIndex[field][row[field]]) {fieldIndex[field][row[field]] = 0;}if (fieldIndex[field][row[field]] === 0) {row[mergeKey] = mergeCounts[field][row[field]];} else {row[mergeKey] = 0;}fieldIndex[field][row[field]]++;});});this.data5 = data;}},mounted() {// 模拟后台返回的数据this.assembleData(this.resData);}
};
</script>

2.基于iview.viewUI实现行合并(列之间有对应关系,只合并属于前一列值所属的内容)

在这里插入图片描述

<template><div style="margin-top:200px"><Table :columns="columns14" :data="data5" border :span-method="handleSpan"></Table></div>
</template><script>
export default {data() {return {columns14: [{title: '序号',key: 'index'},{title: '专业名称',key: 'majorNo'},{title: '设备名称',key: 'devNam'},{title: '检修建议',key: 'overhaulAdvice'},{title: '综合评价等级',key: 'level'}],resData: [{id: '1',devNam: 'CVS设备',overhaulAdvice: "异常说明",level: '未见异常',majorNo: '风电',index: 1},{id: '2',devNam: 'CVS设备',overhaulAdvice: "异常说明",level: '未见异常',majorNo: '风电',index: 2},{id: '3',devNam: '设备1',overhaulAdvice: "异常说明",level: '未见异常',majorNo: '锅炉、风电',index: 3},{id: '4',devNam: '设备1',overhaulAdvice: "异常说明",level: '未见异常',majorNo: '锅炉、风电',index: 4},{id: '5',devNam: 'CVS设备1',overhaulAdvice: "异常说明",level: '未见异常',majorNo: '锅炉',index: 5},],data5: [],};},methods: {// 合并单元格的处理方法handleSpan({ row, column, rowIndex, columnIndex }) {if (columnIndex === 1) {return [row.mergeMajorNo, row.mergeMajorNo ? 1 : 0];}if (columnIndex === 2) {return [row.mergeDevNam, row.mergeDevNam ? 1 : 0];}if (columnIndex === 3) {return [row.mergeOverhaulAdvice, row.mergeOverhaulAdvice ? 1 : 0];}if (columnIndex === 4) {return [row.mergeLevel, row.mergeLevel ? 1 : 0];}},// 组装数据以便处理合并单元格assembleData(data) {let majorNos = [];let devNamesByMajorNo = {};let overhaulAdviceByDevName = {};let levelByDevName = {};// 获取所有唯一的专业名称,并初始化每个专业名称对应的设备名称列表data.forEach(e => {if (!majorNos.includes(e.majorNo)) {majorNos.push(e.majorNo);//q:这句代码的作用是什么? a:获取所有唯一的专业名称devNamesByMajorNo[e.majorNo] = [];//q:这句代码的作用是什么? a:初始化每个专业名称对应的设备名称列表}if (!devNamesByMajorNo[e.majorNo].includes(e.devNam)) {//q:这句代码的作用是什么? a:获取每个专业名称对应的设备名称列表devNamesByMajorNo[e.majorNo].push(e.devNam);}if (!overhaulAdviceByDevName[e.devNam]) { //q:这句代码的作用是什么? a:初始化每个设备名称对应的检修建议列表overhaulAdviceByDevName[e.devNam] = [];}if (!overhaulAdviceByDevName[e.devNam].includes(e.overhaulAdvice)) { //q:这句代码的作用是什么? a:获取每个设备名称对应的检修建议列表overhaulAdviceByDevName[e.devNam].push(e.overhaulAdvice);}if (!levelByDevName[e.devNam]) {  //q:这句代码的作用是什么? a:初始化每个设备名称对应的综合评价等级列表levelByDevName[e.devNam] = [];}if (!levelByDevName[e.devNam].includes(e.level)) {  //q:这句代码的作用是什么? a:获取每个设备名称对应的综合评价等级列表levelByDevName[e.devNam].push(e.level);}});let majorNoNums = []; // 专业名称的合并单元格数let devNameNumsByMajorNo = {};  // 设备名称的合并单元格数 //q:为什么专业名称的合并单元格数是数组,这里是对象? a:因为专业名称是唯一的,设备名称是不唯一的let overhaulAdviceNumsByDevName = {}; // 检修建议的合并单元格数let levelNumsByDevName = {};  // 综合评价等级的合并单元格数// 初始化每个专业名称和设备名称的合并单元格数majorNos.forEach(e => {majorNoNums.push({ majorNo: e, num: 0 });devNameNumsByMajorNo[e] = [];devNamesByMajorNo[e].forEach(devNam => {devNameNumsByMajorNo[e].push({ devNam: devNam, num: 0 });});});// 初始化每个设备名称下的检修建议和综合评价等级的合并单元格数for (let devNam in overhaulAdviceByDevName) {overhaulAdviceNumsByDevName[devNam] = [];overhaulAdviceByDevName[devNam].forEach(overhaulAdvice => {overhaulAdviceNumsByDevName[devNam].push({ overhaulAdvice: overhaulAdvice, num: 0 });});levelNumsByDevName[devNam] = [];levelByDevName[devNam].forEach(level => {levelNumsByDevName[devNam].push({ level: level, num: 0 });});}// 计算每个专业名称和设备名称需要合并的单元格数data.forEach(e => {majorNoNums.forEach(d => {if (e.majorNo === d.majorNo) {d.num++;}});devNameNumsByMajorNo[e.majorNo].forEach(n => {if (e.devNam === n.devNam) {n.num++;}});overhaulAdviceNumsByDevName[e.devNam].forEach(n => {if (e.overhaulAdvice === n.overhaulAdvice) {n.num++;}});levelNumsByDevName[e.devNam].forEach(n => {if (e.level === n.level) {n.num++;}});});// 更新数据中的合并单元格数data.forEach(e => {majorNoNums.forEach(d => {if (e.majorNo === d.majorNo) {if (majorNos.includes(e.majorNo)) {e.mergeMajorNo = d.num;majorNos.splice(majorNos.indexOf(d.majorNo), 1);} else {e.mergeMajorNo = 0;}}});devNameNumsByMajorNo[e.majorNo].forEach(n => {if (e.devNam === n.devNam) {if (devNamesByMajorNo[e.majorNo].includes(e.devNam)) {e.mergeDevNam = n.num;devNamesByMajorNo[e.majorNo].splice(devNamesByMajorNo[e.majorNo].indexOf(e.devNam), 1);} else {e.mergeDevNam = 0;}}});overhaulAdviceNumsByDevName[e.devNam].forEach(n => {if (e.overhaulAdvice === n.overhaulAdvice) {if (overhaulAdviceByDevName[e.devNam].includes(e.overhaulAdvice)) {e.mergeOverhaulAdvice = n.num;overhaulAdviceByDevName[e.devNam].splice(overhaulAdviceByDevName[e.devNam].indexOf(e.overhaulAdvice), 1);} else {e.mergeOverhaulAdvice = 0;}}});levelNumsByDevName[e.devNam].forEach(n => {if (e.level === n.level) {if (levelByDevName[e.devNam].includes(e.level)) {e.mergeLevel = n.num;levelByDevName[e.devNam].splice(levelByDevName[e.devNam].indexOf(e.level), 1);} else {e.mergeLevel = 0;}}});});// 将整理后的数据交给表格渲染this.data5 = data;}},mounted() {// 模拟后台返回的数据this.assembleData(this.resData);}
};
</script>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/368954.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

嵌入式Linux系统编程 — 6.7 实时信号

目录 1 什么是实时信号 2 sigqueue函数 3 sigpending()函数 1 什么是实时信号 等待信号集只是一个掩码&#xff0c;它并不追踪信号的发生次数。这意味着&#xff0c;如果相同的信号在被阻塞的状态下多次产生&#xff0c;它只会在信号集中被记录一次&#xff0c;并且在信号集…

SLAM 精度评估

SLAM 精度的评估有两个最重要的指标&#xff0c;即绝对轨迹误差&#xff08;ATE&#xff09;和相对位姿误差&#xff08;RPE&#xff09;的 均方根误差&#xff08;RMSE&#xff09;: 绝对轨迹误差:直接计算相机位姿的真实值与 SLAM 系统的估计值之间的差值&#xff0c;首先将…

kubernetes service 服务

1 service作用 使用kubernetes集群运行工作负载时&#xff0c;由于Pod经常处于用后即焚状态&#xff0c;Pod经常被重新生成&#xff0c;因此Pod对应的IP地址也会经常变化&#xff0c;导致无法直接访问Pod提供的服务&#xff0c;Kubernetes中使用了Service来解决这一问题&#…

【Linux】多线程(互斥 同步)

我们在上一节多线程提到没有任何保护措施的抢票是会造成数据不一致的问题的。 那我们怎么办&#xff1f; 答案就是进行加锁。 目录 加锁&#xff1a;认识锁和接口&#xff1a;初始化&#xff1a;加锁 && 解锁&#xff1a;全局的方式&#xff1a;局部的方式&#xff1a…

【SkiaSharp绘图15】SKPath属性详解:边界、填充、凹凸、类型判断、坐标、路径类型

文章目录 SKPath 构造函数SKPath 属性Bounds 边界(宽边界)TightBounds紧边界FillType填充方式IsConcave 是否凹/ IsConvex 是否凸IsEmpty是否为空IsLine是否为线段IsRect是否为矩形IsOval是否为椭圆或圆IsRoundRect是否为圆角矩形Item[] 获取路径的坐标LastPoint最后点的坐标Po…

2024最全软件测试面试八股文(答案+文档+视频讲解)

Part1 1、你的测试职业发展是什么&#xff1f; 测试经验越多&#xff0c;测试能力越高。所以我的职业发展是需要时间积累的&#xff0c;一步步向着高级测试工程师奔去。而且我也有初步的职业规划&#xff0c;前3年积累测试经验&#xff0c;按如何做好测试工程师的要点去要求自…

OrangePi AIpro开发板测评 —— 相机图像获取

&#x1f482; 个人主页: 同学来啦&#x1f91f; 版权: 本文由【同学来啦】原创、在CSDN首发、需要转载请联系博主 &#x1f4ac; 如果文章对你有帮助&#xff0c;欢迎关注、点赞、收藏和订阅专栏哦 文章目录 &#x1f31f; 一、引言&#x1f31f; 二、OrangePi AIpro 简要介绍…

力扣206

题目 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1]示例 2&#xff1a; 输入&#xff1a;head [1,2] 输出&#xff1a;[2,1]示例 3&#xff1a; 输…

基于Transformer的端到端的目标检测 | 读论文

本文正在参加 人工智能创作者扶持计划 提及到计算机视觉的目标检测&#xff0c;我们一般会最先想到卷积神经网络&#xff08;CNN&#xff09;&#xff0c;因为这算是目标检测领域的开山之作了&#xff0c;在很长的一段时间里人们都折服于卷积神经网络在图像处理领域的优势&…

【数据库】E-R图、E-R模型到关系模式的转换、关系代数表达式、范式

一、E-R图 1、基本概念 2、实体集之间的联系 3、E-R图要点 &#xff08;1&#xff09;实体&#xff08;型&#xff09;的表示 &#xff08;2&#xff09;E-R图属性的表示 &#xff08;3&#xff09;联系的表示 4、E-R模型的例题 二、E-R模型到关系模式的转换 1、实体型的转换…

使用getline()从文件中读取一行字符串

我们知道&#xff0c;getline() 方法定义在 istream 类中&#xff0c;而 fstream 和 ifstream 类继承自 istream 类&#xff0c;因此 fstream 和 ifstream 的类对象可以调用 getline() 成员方法。 当文件流对象调用 getline() 方法时&#xff0c;该方法的功能就变成了从指定文件…

基于STM32F103C8T6的同步电机驱动-CubeMX配置与IQmath调用

基于STM32F103C8T6的同步电机驱动-CubeMX配置与IQmath调用 一、功能描述: 上位机通过CAN总线实现对电机的运动控制,主要包含三种模式:位置模式、速度模式以及力矩模式。驱动器硬件核心为STM32F103C8T6,带相电压采集电路以及母线电压采集电路。其中供电电压12V。 PWM中心对…

【单片机毕业设计选题24047】-基于阿里云的工地环境监测系统

系统功能: 基于STM32完成 主机&#xff08;阿里云以及oled屏显示位置一&#xff09;&#xff1a;烟雾检测&#xff0c;温湿度检测&#xff0c;噪声检测&#xff0c;且用OLED屏显示&#xff0c;设置阈值&#xff0c;超过报警&#xff08;蜂鸣器&#xff09;。 从机&#xff0…

LeetCode题练习与总结:对链表进行插入排序--147

一、题目描述 给定单个链表的头 head &#xff0c;使用 插入排序 对链表进行排序&#xff0c;并返回 排序后链表的头 。 插入排序 算法的步骤: 插入排序是迭代的&#xff0c;每次只移动一个元素&#xff0c;直到所有元素可以形成一个有序的输出列表。每次迭代中&#xff0c;…

Element中的日期时间选择器DateTimePicker和级联选择器Cascader

简述&#xff1a;在Element UI框架中&#xff0c;Cascader&#xff08;级联选择器&#xff09;和DateTimePicker&#xff08;日期时间选择器&#xff09;是两个非常实用且常用的组件&#xff0c;它们分别用于日期选择和多层级选择&#xff0c;提供了丰富的交互体验和便捷的数据…

【server】nacos 安装

1、本地安装 1.1 nacos官网 Nacos官网| Nacos 配置中心 | Nacos 下载| Nacos 官方社区 | Nacos 官网 git 下载地址&#xff1a;https://github.com/alibaba/nacos/releases 1.2 解压并修改配置 1.2.1 通过properties 修改配置&#xff0c;添加数据库配置 1.2.2 创建数据库&…

字节码编程ASM之生成变量并sout

写在前面 本文看下如何通过asm生成变量并sout。 1&#xff1a;代码 直接看代码吧&#xff0c;注释很详细&#xff0c;有不懂的&#xff0c;留言告诉我&#xff1a; package com.dahuyuo.asmtest;import org.objectweb.asm.*; import org.objectweb.asm.commons.AdviceAdapt…

VCS+Vivado联合仿真BUG

场景&#xff1a; 在vcsvivado联合仿真过程中&#xff0c;对vivado导出的shell脚本修改&#xff0c;修改某些source文件路径&#xff0c;vcs编译时会报Permission Denied。 问题描述 对shell脚本修改如下&#xff1a; 修改仅为注释掉某一行&#xff0c;下面变为source文件新…

Linux shell编程学习笔记62: top命令 linux下的任务管理器

0 前言 top命令是Unix 和 Linux下常用的性能分析工具&#xff0c;提供了一个动态的、交互式的实时视图&#xff0c;显示系统的整体性能信息&#xff0c;以及正在运行的进程的相关信息&#xff0c;包括各个进程的资源占用状况&#xff0c;类似于Windows的任务管理器。 1 top命令…

数据特征采样在 MySQL 同步一致性校验中的实践

作者&#xff1a;vivo 互联网存储研发团队 - Shang Yongxing 本文介绍了当前DTS应用中&#xff0c;MySQL数据同步使用到的数据一致性校验工具&#xff0c;并对它的实现思路进行分享。 一、背景 在 MySQL 的使用过程中&#xff0c;经常会因为如集群拆分、数据传输、数据聚合等…