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

news2024/10/6 2:53:38

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.coloradmin.cn/o/1872141.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【EXCEL技巧】Excel如何将数字前面的0去掉

Excel文件中经常会遇到数据是0001345这种&#xff0c;那么&#xff0c;如何将数字前面的0去掉呢&#xff1f;今天和大家分享方法。 首先&#xff0c;选中一列空的单元格&#xff0c;然后在单元格中输入公式TEXT(D3,0)&#xff0c;这里的D3指的是前面带有0的数据的位置 回车之后…

Linux基础- 使用 Apache 服务部署静态网站

目录 零. 简介 一. linux安装Apache 二. 创建网页 三. window访问 修改了一下默认端口 到 8080 零. 简介 Apache 是世界使用排名第一的 Web 服务器软件。 它具有以下一些显著特点和优势&#xff1a; 开源免费&#xff1a;可以免费使用和修改&#xff0c;拥有庞大的社区支…

小程序备案小程序认证双系统

​打造安全合规的线上平台 &#x1f50d; 一、引言&#xff1a;为何需要小程序备案与认证&#xff1f; 在数字化快速发展的今天&#xff0c;小程序已成为企业、个人展示自身、提供服务的重要窗口。然而&#xff0c;随着小程序数量的快速增长&#xff0c;安全、合规等问题也逐渐…

jenkins设置定时构建语法

一、设置定时 定时构建的语法是*** * * * ***。 第一个*表示分钟&#xff0c;取值范围是0~59。例如&#xff0c;5 * * * *表示每个小时的第5分钟会构建一次&#xff1b;H/15 * * * 或/15 * * * 表示每隔15分钟构建一次&#xff1b; 第2个表示小时&#xff0c;取值范围是0~23。…

深度解析RocketMq源码-IndexFile

1.绪论 在工作中&#xff0c;我们经常需要根据msgKey查询到某条日志。但是&#xff0c;通过前面对commitLog分析&#xff0c;producer将消息推送到broker过后&#xff0c;其实broker是直接消息到达broker的先后顺序写入到commitLog中的。我们如果想根据msgKey检索一条消息无疑…

Embedding 、词嵌入、向量模型说的是一回事么?AI是如何理解世界?AI人不能不看的Embedding白话科普!

在AI理解世界的过程中&#xff0c;向量模型扮演着一个至关重要的角色&#xff0c;甚至可以说它是AI大模型用以构建和理解复杂数据的基础&#xff0c;也是对不同形态数据的一种标准化的“浓缩”。它能够将语言、图像、声音等多样化的信息&#xff0c;转化为一种通用的、数学化的…

知乎正通过乱码来干扰必应/谷歌等爬虫,从而限制中文数据集被用于AI训练

有用户反馈称使用微软必应搜索和谷歌搜索发现存在不少知乎乱码内容&#xff0c;即搜索结果里知乎内容的标题和正文内容都可能是乱码的&#xff0c;但抓取的正文前面一些段落内容可以正常查看。考虑到此前知乎已经屏蔽除百度和搜狗以外的所有搜索引擎爬虫 (蜘蛛 / 机器人)&#…

《数字图像处理与机器视觉》案例二(基于边缘检测和数学形态学焊缝图像处理)

一、前言 焊缝是评价焊接质量的重要标志&#xff0c;人工检测方法存在检测标准不统一&#xff0c;检测精度低&#xff0c;焊缝视觉检测技术作为一种重要的质量检测方法&#xff0c;正逐渐在各行各业中崭露头角。把焊缝准确的从焊接工件中准确分割出来是焊缝评价的关键一步&…

使用模板方法设计模式封装 socket 套接字并实现Tcp服务器和客户端 简单工厂模式设计

文章目录 使用模板方法设计模式封装套接字使用封装后的套接字实现Tcp服务器和客户端实现Tcp服务器实现Tcp客户端 工厂模式 使用模板方法设计模式封装套接字 可以使用模块方法设计模式来设计套接字 socket 的封装 模板方法&#xff08;Template Method&#xff09;设计模式是一…

百度ueditor如何修改图片的保存位置

背景 编辑器的保存图片是设置有默认规则的&#xff0c;但是服务器上一般会把图片路径设置为软连接&#xff0c;所以我就需要更改编辑器保存图片的路径&#xff0c;要不然&#xff0c;每次有新的部署&#xff0c;上一次上传的图片就会失效。先来看看编辑器默认的保存路径吧&…

目标检测算法之RT-DETR

RT-DETR算法理解 BackgroundModel ArchitectureEfficient Hybrid EncoderUncertainty-minimal Query Selection 总结 Background Real-time Detection Transformer&#xff08;RT-DETR&#xff09;是一个基于tranformer的实时推理目标检测模型。RT-DETR是2023年百度发布的一个…

七天速通javaSE:第五天 数组进阶

文章目录 前言一、二维数组二、Arrays类1.toString打印数组内各元素1.1 示例1.2 自己实现内部逻辑 2. sort升序排列3. fill数组填充&#xff08;重新赋值&#xff09;4.equals比较数组元素是否相等 三、冒泡排序 前言 本文将学习二维数组、arrays类以及冒泡排序 一、二维数组 …

重生奇迹MU新手攻略:如何一步步往大佬发展

装备强化攻略&#xff1a; 提纯装备&#xff1a;通过提纯装备可以提升基础属性&#xff0c;选择合适的装备进行提纯可以获得更好的效果。 镶嵌宝石&#xff1a;使用宝石进行装备镶嵌可以增加装备的属性&#xff0c;根据需要选择适合的宝石进行镶嵌。 洗练装备&#xff1a;通…

基于盲信号处理的声音分离——最大化信噪比的ICA算法

基于最大化信噪比的ICA算法是一种较新模式的ICA算法&#xff0c;在该算法中利用输出信号的信噪比建立信噪比函数作为该算法的代价函数。 在上式中&#xff0c;用S表示原信号&#xff0c;Y表示输出信号。由于原信号S并不知道&#xff0c;因此采用估计信号Y的滑动平均 来代替&…

激励视频广告的eCPM更高,每天的展示频次有限制吗?

在APP发展初期&#xff0c;由于DUA量级有限&#xff0c;所需的广告资源比较少&#xff0c;往往接入1-2家广告平台就能满足APP用户每日需要的广告展示量。而随着APP用户规模的扩大、广告场景的不断丰富&#xff0c;开发者要提升APP整体广告变现收益&#xff0c;一是可以尽可能多…

PLC数据采集案例

--------天津三石峰科技案例分享 项目介绍 项目背景 本项目为天津某钢铁集团下数字化改造项目&#xff0c;主要解决天津大型钢厂加氢站数字化改造过程中遇到的数据采集需求。项目难点PLC已经在运行了&#xff0c;需要采集里面数据&#xff0c;不修改程序&#xff0c;不影响P…

3D立体卡片动效(附源码)

3D立体卡片动效 欢迎关注&#xff1a;xssy5431 小拾岁月参考链接&#xff1a;https://mp.weixin.qq.com/s/9xEjPAA38pRiIampxjXNKQ 效果展示 思路分析 需求含有立体这种关键词&#xff0c;我们第一反应是采用动画中的平移、倾斜等实现。如果是立体&#xff0c;必然产生阴影&…

浅谈制造业EHS管理需要关注的重点

在快速发展的制造业中&#xff0c;EHS&#xff08;环境、健康、安全&#xff09;管理体系如同一道坚实的屏障&#xff0c;守护着企业的绿色与安全。那么&#xff0c;这个管理体系到底包含哪些内容呢&#xff1f;接下来&#xff0c;让我们一同探寻其奥秘。 一、EHS管理体系的丰富…

你的钱花得值不值?简谈FMEA培训的投资与回报

在探讨 FMEA&#xff08;失效模式及影响分析&#xff09;培训是否值得投资时&#xff0c;需要综合考虑多个方面。 从投资的角度来看&#xff0c;FMEA 培训通常需要一定的费用支出&#xff0c;包括培训课程的费用、培训期间员工的时间成本以及可能涉及的培训材料和设备成本。 然…

利用MMDetection将单阶段检测器作为Faster R-CNN的RPN

将单阶段检测器作为RPN 一、在 Faster R-CNN 中使用 FCOSHead 作为 RPNHead与原始配置的对比结果Neck (FPN)RPN HeadROI Head学习率 使用单阶段检测器作为RPN的优势1. 速度提升2. 准确性3. 简化架构4. 灵活性 二、评估候选区域三、用预先训练的 FCOS 训练定制的 Faster R-CNN 本…