基于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>


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

查找python包的安装路径

前提&#xff1a;自己已经安装过的包 1、打开任一python解析器&#xff0c;如VSCode 2、 以matplotlib为例&#xff0c;敲下面命令 import matplotlibprint(matplotlib.path) 3、运行代码就可以了 需要注意&#xff1a; 部分包没有path&#xff08;比如time&#xff09;&am…

使用 Java Swing 和 XChart 创建多种图表

在现代应用程序开发中&#xff0c;数据可视化是一个关键部分。本文将介绍如何使用 Java Swing 和 XChart 库创建各种类型的图表。XChart 是一个轻量级的图表库&#xff0c;支持多种类型的图表&#xff0c;非常适合在 Java 应用中进行快速的图表绘制。 1、环境配置 在开始之前&…

ElementUI中的el-table解决宽度问题 - 根据内容自动撑开

在使用element-ui中&#xff0c;会发现表格组件el-table在未指定宽度情况下&#xff0c;会自动计算并给表格宽度赋值。但实际开发中&#xff0c;有时需要根据内容实际长度自动撑开显示&#xff0c;由内容的多少而决定表格的宽度&#xff0c;而不是默认宽度为100%。在默认情况下…

韩语日常口语留学韩语旅游韩语口语柯桥语言培训

韩语每日一词打卡&#xff1a;행정적[행정적]【名词】行政 原文:나라는 항상 행정적 명령을 통해 경제운행을 조절합니다. 意思&#xff1a;国家经常通过行政命令去调节经济的运行。 【原文分解】 1、항상[항상]总是 &#xff0c;经常 2、나라[나라]国家 3、명령[명:녕]命令 …

计算机网络——数据链路层(点对点协议PPP)

点对点协议PPP的概述 对于点对点的链路&#xff0c;目前使用得最广泛的数据链路层协议是点对点协议 PPP (Point-to-Point Protocol)。 它主要应用于两个场景&#xff1a; 用户计算机与ISP之间的链路层协议就是点对点协议 PPP&#xff0c;1999年公布了回以在以太网上运行的PPP协…

JAVA每日作业day7.1-7.3小总结

ok了家人们前几天学了一些知识&#xff0c;接下来一起看看吧 一.API Java 的 API &#xff08; API: Application( 应用 ) Programming( 程序 ) Interface(接口 ) &#xff09; Java API 就是 JDK 中提供给我们使用的类&#xff0c;这些类将底层 的代码实现封装了起来&#x…

10 docker 安装 mysql详解

目录 一、安装mysql 1. 镜像获取 2. 简单版 2.1. 使用mysql镜像 2.2. 建库建表插入数据 2.3. 外部win 连接并插入中文数据测试 2.4. 简单版本问题 3. 创建容器-实战版 3.1. 新建容器实列并挂载卷 3.2. 新建my.cnf , 解决中文乱码 3.3. 重启容器验证 3.4. 总结 一、…

2024年精选推荐的16个向量数据库:提升你的AI应用性能

在人工智能时代&#xff0c;向量数据库已成为数据管理和AI模型不可或缺的一部分。向量数据库是一种专门设计用来存储和查询向量嵌入数据的数据库。这些向量嵌入是AI模型用于识别模式、关联和潜在结构的关键数据表示。随着AI和机器学习应用的普及&#xff0c;这些模型生成的嵌入…

聊一聊领域驱动和贫血

写在前面 前段时间跟领导讨论技术债概念时不可避免地提到了代码的质量&#xff0c;而影响代码质量的因素向来都不是单一的&#xff0c;诸如项目因素、管理因素、技术选型、人员素质等等&#xff0c;因为是技术债务&#xff0c;自然就从技术角度来分析&#xff0c;单纯从技术角…

UOS系统中JavaFx笔锋功能

关于笔锋功能&#xff0c;网上找了很久&#xff0c;包括Java平台客户端&#xff0c;Android端&#xff0c;相关代码资料比较少&#xff0c;找了很多经过测试效果都差强人意&#xff0c;自己也搓不出来&#xff0c;在UOS平台上JavaFX也获取不到压力值&#xff0c;只能用速度的变…

c++习题07-求小数的某一位

目录 一&#xff0c;问题 二&#xff0c;思路 三&#xff0c;代码 一&#xff0c;问题 二&#xff0c;思路 被除数a的类型设置为long long类型&#xff0c;a变量需要变大&#xff0c;需要更大的数据类型来存储除数b和指定的小数位置n为int类型&#xff0c;这两个变量的的…

计算机图形学入门23:蒙特卡洛路径追踪

1.前言 前面几篇文章介绍了Whitted-style光线追踪&#xff0c;还介绍了基于物理渲染的基础知识&#xff0c;包括辐射度量学、BRDF以及渲染方程&#xff0c;但并没有给出解渲染方程的方法&#xff0c;或者说如何通过该渲染方程计算出屏幕上每一个坐标的像素值。 Whitted-style光…

未来的钥匙在于过去:学历史的真正意义,震惊!历史竟然是偶然的?从历史中寻找未来的方向!

我们自幼接受的教育是&#xff0c;学历史是为了相信历史是必然的。中国人民必然战胜日寇的侵略&#xff0c;解放思想和改革开放必定会发生&#xff0c;和平和发展必定是世界的主题&#xff0c;中国经济必定是高速增长…… 然而&#xff0c;在真正的历史学家眼中&#xff0c;历史…

1分钟了解,预写日志WAL的核心思路...

上一篇《刷盘&#xff0c;还是不刷盘&#xff0c;是一个问题》中我们遇到了哪些问题&#xff1f; 1. 已提交事务未提交事务的ACID特性怎么保证&#xff1f; 画外音&#xff1a;上一篇中遇到的问题&#xff0c;主要是原子性与持久性。 2. 数据库崩溃&#xff0c;怎么实施故障恢复…

新声创新20年:无线技术给助听器插上“娱乐”的翅膀

听力损失并非现代人的专利&#xff0c;古代人也会有听力损失。助听器距今发展已经有二百多年了&#xff0c;从当初单纯的声音放大器到如今的全数字时代助听器&#xff0c;助听器发生了翻天覆地的变化&#xff0c;现代助听器除了助听功能&#xff0c;还具有看电视&#xff0c;听…

AD导入.step 3D封装

在网站查找想要的3D封装 https://www.3dcontentcentral.cn/ 下载 AD导入 在封装库下导入

融云上线 HarmonyOS NEXT 版 SDK,全面适配「纯血鸿蒙」生态

6 月 21 日&#xff0c;“2024 华为开发者大会”正式发布使用自研内核的原生鸿蒙系统 HarmonyOS NEXT&#xff0c;即 “纯血鸿蒙”。 同时&#xff0c;华为宣布开放“鸿蒙生态伙伴 SDK 市场”&#xff0c;甄选各类优质、安全的 SDK 加入聚合平台&#xff0c;助力各行业开发者轻…

数据结构初阶 堆的问题详解(三)

题目一 4.一棵完全二叉树的节点数位为531个&#xff0c;那么这棵树的高度为&#xff08; &#xff09; A 11 B 10 C 8 D 12 我们有最大的节点如下 假设最大高度为10 那么它的最多节点应该是有1023 假设最大高度为9 那么它的最多节点应该是 511 所以说这一题选B 题目二 …

08 docker Registry搭建docker私仓

目录 本地镜像发布流程 1. docker pull registry 下载镜像 2. docker run 运行私有库registry 3. docker commit 构建镜像 4. docker tag 修改新镜像&#xff0c;使之符合私服规范tag 5. 修改配置文件使之支持http 6. curl验证私服库上有什么镜像 7. push推送 pull拉取 …

Jenkins教程-13-参数化任务构建

上一小节我们学习了发送html邮件测试报告的方法&#xff0c;本小节我们讲解一下Jenkins参数化任务构建的方法。 很多时候我们需要根据不同的条件去执行构建&#xff0c;如自动化测试中执行test、stg、prod环境的构建&#xff0c;Jenkins是支持参数化构建的。 以下是Jenkins官…