el-table,列表合并,根据名称列名称相同的品名将其它列值相同的进行合并

el-table,列表合并,根据名称列名称相同的品名讲其它列值相同的进行合并,并且不能垮品名合并

如图
在这里插入图片描述
用到el-table合并行的方法合并
在这里插入图片描述


tableSpanMethod({ row, column, rowIndex, columnIndex }) {
  if (column.property === "materielName") {
    //合并商品名
    const _row = this.spanArr[rowIndex];
    const _col = _row > 0 ? 1 : 0;
    return {
      rowspan: _row,
      colspan: _col,
    };
  }
  // 其它列根据商品名进行合并
  if (column.property === "pieceUnit" || column.property === "pieceNum") {
    const _row = this.spanNewArr[rowIndex] ? this.spanNewArr[rowIndex] : 0;
    return {
      rowspan: _row,
      colspan: _row > 0 ? 1 : 0,
    };
  }
},
   // 获取合并行
    getSpanArr(data) {
      this.spanArr = []; //第2列合并
      let pos = 0; //index

      for (let i = 0; i < data.length; i++) {
        1;
        if (i === 0) {
          // 如果是第一条记录(即索引是0的时候),向数组中加入1
          this.spanArr.push(1); //第二列合并
        } else {
          //第二列合并
          if (data[i].materielName === data[i - 1].materielName) {
            // 如果orgUnitId相等就累加,并且push 0
            this.spanArr[pos] += 1;
            this.spanArr.push(0);
          } else {
            // 不相等push 1
            this.spanArr.push(1);
            pos = i;
          }
        }
      }

      this.spanNewArr = {};
      let tip = 0;
      this.spanArr.forEach((item, index) => {
        for (let i = 0; i < item; i++) {
          const row = data[i + index];
          const lastrow = data[i + index - 1];
          if (i == 0) {
            this.spanNewArr[i + index] = 1;
            tip = i + index;
          } else {
            if (
              row.pieceUnit == lastrow.pieceUnit ||
              row.pieceNum == lastrow.pieceNum
            ) {
              this.spanNewArr[tip] = this.spanNewArr[tip]
                ? this.spanNewArr[tip]
                : 1;
              this.spanNewArr[tip] += 1;
            } else {
              this.spanNewArr[i + index] = 1;
              tip = i + index;
            }
          }
        }
      });

      console.log(this.spanNewArr);
    },

然后在初始值的时候调取方法

   this.getSpanArr(this.tableData);

方法二:一个全新的demo,更简单一些

<template>
  <div>
    <el-table
      :data="tableData"
      :span-method="objectSpanMethod"
      border
      style="width: 100%"
    >
      <el-table-column prop="grade" label="年级"></el-table-column>
      <el-table-column prop="materielName" label="商品名称"></el-table-column>
      <el-table-column prop="score" label="成绩"></el-table-column>
      <el-table-column prop="pieceUnit" label="计件单位"></el-table-column>
    </el-table>
  </div>
</template>

<script>
export default {
  name: "App",
  data() {
    return {
      tableData: [
        {
          grade: "三年二班",
          materielName: "消防水带",
          pieceUnit: "把",
          score: 80,
        },

        {
          grade: "三年二班",
          materielName: "消防水带",
          pieceUnit: "把",
          score: 80,
        },

        {
          grade: "三年一班",
          materielName: "小雷",
          pieceUnit: "把",
          score: 80,
        },

        {
          grade: "三年一班",
          materielName: "小雷",
          pieceUnit: "个",
          score: 80,
        },

        {
          grade: "三年三班",
          materielName: "小雷",
          pieceUnit: "个",
          score: 60,
        },

        {
          grade: "三年三班",
          materielName: "林俊杰",
          pieceUnit: "个",
          score: 60,
        },
        {
          grade: "三年三班",
          materielName: "林俊杰",
          pieceUnit: "个",
          score: 60,
        },
        {
          grade: "三年三班",
          materielName: "林俊杰",
          pieceUnit: "把",
          score: 60,
        },
      ],
      mergeInfo: {
        fieldMap: {},
        fieldList: ["materielName", "score", "pieceUnit"], // 需要合并的列字段
      },
    };
  },
  watch: {
    tableData: {
      immediate: true,
      deep: true,
      handler: function (newVal) {
        this.formatMergeInfo(newVal || []);
      },
    },
  },
  methods: {
    formatMergeInfo(sourceData) {
      // 需要合并的列字段列表
      const mergeFieldList = this.mergeInfo.fieldList;

      const result = mergeFieldList.reduce((prev, prop) => {
        let pos = 0;
        const rowList = [];

        // 记录第一个字段,后面的合并不能超过第一个
        const firstField = mergeFieldList[0];

        sourceData.forEach((item, index) => {
          // 数据为第一行,直接加入新行 1 表示新行
          if (index === 0) {
            rowList.push(1);
          } else {
            // 判断当前行是否与上一行其值相等
            if (item[prop] === sourceData[index - 1][prop]) {
              // 是否第一个,第一次循环时,这里没有值
              if (prev[firstField]) {
                // 再看同样的位置上,第一个字段是否与前一个一样,也一样就是同一组,不一样就是下一组
                if (sourceData[index - 1][firstField] === item[firstField]) {
                  // 相等就加一,即合并这一行
                  rowList[pos] += 1;
                  // 并在这一行占个位置
                  rowList.push(0);
                } else {
                  // 下一组;
                  pos = index;
                  rowList.push(1);
                }
              } else {
                rowList[pos] += 1;
                // 占个位置
                rowList.push(0);
              }
            } else {
              // 不等就开始新的一行,并记录这个位置,用于它后面的行合并到它这里
              pos = index;
              rowList.push(1);
            }
          }
        });
        prev[prop] = rowList;
        return prev;
      }, {});
      console.log(result, "---r");
      this.mergeInfo.fieldMap = result;
    },
    // 默认接受四个值 { 当前行的值, 当前列的值, 行的下标, 列的下标 }
    objectSpanMethod({ column, rowIndex }) {
      const mergeFieldList = this.mergeInfo.fieldList;
      const mergeFieldMap = this.mergeInfo.fieldMap;
      // 判断列的属性v
      if (mergeFieldList.indexOf(column.property) !== -1) {
        // 判断其值是不是为0
        if (mergeFieldMap[column.property][rowIndex]) {
          return [mergeFieldMap[column.property][rowIndex], 1];
        } else {
          // 如果为0则为需要合并的行
          return [0, 0];
        }
      }
    },
  },
};
</script>

<style>
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>

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

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

相关文章

LeetCode-805.保持城市天际线 C/C++实现 超详细思路及过程[M]

&#x1f388;归属专栏&#xff1a;深夜咖啡配算法 &#x1f697;个人主页&#xff1a;Jammingpro &#x1f41f;记录一句&#xff1a;摆烂一天后&#xff0c;写的第一篇博客 文章目录 LeetCode-807. 保持城市天际线&#x1f697;题目&#x1f686;题目描述&#x1f686;题目示…

Java程序连接 nacos集群

我们在bootstrap.yml文件里可以直接连一个nacos集群的. 架构如下 没错,我们程序直连的是通过Nginx的,利用nginx的反向代理来做到连接nacos集群. 我们先把nginx的配置贴上来 upstream cluster{server 127.0.0.1:8848;server 127.0.0.1:8849;server 127.0.0.1:8850; }server{l…

视频字幕处理+AI绘画,Runway 全功能超详细使用教程(4)

runway的视频字幕处理、AI绘图功能介绍&#xff0c;感觉完全就是为了做电影而布局&#xff0c;一整套功能都上线了&#xff01;想系统学习的必收藏&#xff01; 在深度研究Runway各个功能后&#xff0c;无论是AI视频生成及后期处理技术&#xff0c;还是AI图像生成技术&#xff…

如何控制Spring工厂创建对象的次数?详解Spring对象的声明周期!

&#x1f609;&#x1f609; 学习交流群&#xff1a; ✅✅1&#xff1a;这是孙哥suns给大家的福利&#xff01; ✨✨2&#xff1a;我们免费分享Netty、Dubbo、k8s、Mybatis、Spring...应用和源码级别的视频资料 &#x1f96d;&#x1f96d;3&#xff1a;QQ群&#xff1a;583783…

怎么更新BI报表数据?问我就对了

BI大数据分析工具上有大量的BI报表模板&#xff0c;这些模板都是一个个完整的BI报表&#xff0c;只需将数据源更换&#xff0c;立即就能用来分析我们自己的数据。那&#xff0c;BI报表的数据怎么更新&#xff1f;接下来就来说说这事。 目的&#xff1a;更新BI报表数据 工具&a…

如何编写自己的python包,并在本地进行使用

如何编写自己的python包,并在本地进行使用 一、直接引用 1.创建Python项目pythonProject。 2.并且在此项目下创建pg_message包。 3.pg_message包下默认生成_init_.py文件。 Python中_init_.py是package的标志。init.py 文件的一个主要作用是将文件夹变为一个Python模块,Pyt…

如何使用企业微信 WorkTool API 开源框架快速开发企微聊天机器人(详细教程)

WorkTool 基本框架概述 WorkTool 是一个依附于企业微信来运行的无人值守群管理机器人程序&#xff0c;WorkTool 开源&#xff0c;并且永久免费。您可以使用本应用程序来自动执行一个自己企业微信里的账号&#xff08;当做机器人账号&#xff09;可通过后台调用对应的 API 来驱…

Jmeter和Testlink自动化测试框架研究与实施

摘 要 目前基于Jmeter的接口自动化测试框架&#xff0c;大多只实现脚本维护和自动调度&#xff0c;无法与Testlink进行互通&#xff0c;实现测试方案与自动化实施流程连接&#xff0c;本文基于Testlink、Jmeter、Jenkins实现&#xff1a;通过Testlink统一维护接口自动化测试用…

ArrayList和顺序表

目录 线性表 顺序表 实现顺序表&#xff1a; 1&#xff0c;添加元素的时候我们要判断是否需要扩容 2&#xff0c;写异常 3,数组清空 ArrayList&#xff1a; ArrayList的构造方法&#xff1a; ArrayList的add方法&#xff1a; ArrayList的subList 知识点补充&#xff…

知识蒸馏—原理+代码实战(Distillation CNN 和 Progressive Distillation Diffusion)

文章目录 1. Distillation 基本概念2. Distillation MNIST CNN分类代码实战3. Progressive Distillation Diffusion生成代码实战3.1 Progressive Distillation原理3.2 v-parameterization3.2 渐进蒸馏 cifar 代码实战 1. Distillation 基本概念 知识蒸馏被广泛的用于模型压缩和…

使用STM32 HAL库驱动光电传感器的设计和优化

光电传感器在许多应用中起着重要的作用&#xff0c;例如自动计数、距离测量等。STM32微控制器和HAL库提供了丰富的功能和易于使用的接口&#xff0c;使得光电传感器的设计和优化变得更加便捷。本文将介绍如何使用STM32 HAL库驱动光电传感器的设计和优化&#xff0c;包括硬件设计…

Linux Nmap命令解析(Nmap指令)(功能:主机发现、ping扫描、arp扫描、端口扫描、服务版本检测、操作系统识别等)

文章目录 Linux Nmap 命令解析简介Nmap 的核心功能主机发现端口扫描服务版本检测OS 指纹识别&#xff08;操作系统指纹识别&#xff09;脚本扫描 安装 NmapNmap 命令结构Nmap 命令文档英文中文 主机发现Ping 扫描ARP 扫描关于nmap -PR&#xff08;ARP Ping Scan&#xff09;和n…

接口测试工具(Jmeter)必学技巧

安装 使用JMeter的前提需要安装JDK&#xff0c;需要JDK1.7以上版本 目前在用的是JMeter5.2版本&#xff0c;大家可自行下载解压使用 运行 进入解压路径如E: \apache-jmeter-5.2\bin&#xff0c;双击jmeter.bat启动运行 启动后默认为英文版本&#xff0c;可通过Options – Choos…

web:NewsCenter

题目 打开页面显示如下 页面有个输入框&#xff0c;猜测是sql注入&#xff0c;即search为注入参数点&#xff0c;先尝试一下 返回空白显示错误 正常显示如下 是因为单引号与服务端代码中的’形成闭合&#xff0c;输入的字符串hello包裹&#xff0c;服务端代码后面多出来一个‘导…

java学习part18抽象类

Java抽象类 详解-CSDN博客 111-面向对象(高级)-抽象类与抽象方法的使用_哔哩哔哩_bilibili 1.概念 2.抽象类 抽象类不能实例化&#xff0c;可以有属性&#xff0c;也可以有方法。 方法可以实现或者只声明不实现&#xff0c;要加一个abstract abstract class A{//定义一个抽…

51单片机使用串口查看程序执行的数据

51单片机使用串口查看程序执行的数据 1.概述 这篇文章介绍利用串口输出程序执行的数据&#xff0c;辅助我们调试程序&#xff0c;提高代码定位问题的效率。 2.硬件电路原理 3.串口助手查看程序数据 输出串口数据的方式分为CPU查询方式和中断方式。他们各有优缺点&#xff0…

【CVE-2023-49103】ownCloud graphapi信息泄露漏洞(2023年11月发布)

漏洞简介 ownCloud owncloud/graphapi 0.2.x在0.2.1之前和0.3.x在0.3.1之前存在漏洞。graphapi应用程序依赖于提供URL的第三方GetPhpInfo.php库。当访问此URL时&#xff0c;会显示PHP环境的配置详细信息&#xff08;phpinfo&#xff09;。此信息包括Web服务器的所有环境变量&a…

k8s部署sonarqube

1.先决条件需要storageClass,动态制备,自动创建pv/pvc.详情参见 k8s-StoargClass的使用-基于nfs-CSDN博客 部署postgresql 2.创建ServiceAccount,用于权限管控. [rootmaster /zpf/test]$cat init-sc-serviceaccount.yaml apiVersion: v1 kind: ServiceAccount metadata:nam…

Joint Bilateral Upsampling

Abstract 图像分析和增强任务&#xff08;例如色调映射、着色、立体深度和蒙太奇&#xff09;通常需要在像素网格上计算解决方案&#xff08;例如&#xff0c;曝光、色度、视差、标签&#xff09;。计算和内存成本通常要求在下采样图像上运行较小的解决方案。尽管通用上采样方…

【MySql】14- 实践篇(十二)-grant权限/分区表/自增Id用完怎么办

文章目录 1.grant之后要跟着flush privileges吗&#xff1f;1.1 全局权限1.2 db 权限1.3 表权限和列权限1.4 flush privileges 使用场景 2. 要不要使用分区表?2.1 分区表是什么?2.2 分区表的引擎层行为2.3 分区策略2.4 分区表的 server 层行为2.5 分区表的应用场景 3. 自增Id…