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/195704.html

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

相关文章

数据可视化:在Jupyter中使用Matplotlib绘制常用图表

Matplotlib是一个强大的数据可视化库&#xff0c;用于创建各种图表。 在Jupyter中使用Matplotlib可以轻松实现折线图、柱状图、散点图和饼图等常用图表。 本篇文章将为你详细讲解用matlpotlib绘制常用图表的方法。 1、折线图 折线图是展示数据趋势和变化的常见图表类型。 …

从零带你底层实现unordered_map (2)

&#x1f4af; 博客内容&#xff1a;从零带你实现unordered_map &#x1f600; 作  者&#xff1a;陈大大陈 &#x1f680; 个人简介&#xff1a;一个正在努力学技术的准C后端工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎私信&#xff01; &#x1f496; 欢迎大家…

8 有损压缩的.jpg图片文件格式详解,解封装拆包

有损压缩的.jpg文件 作者将狼才鲸创建日期2023-11-28 1&#xff09;简述 JPEG文件描述 JPEG协议格式分为JPEG、渐进式JPEG&#xff08;图片先显示一部分再显示全部&#xff09;、JPEG2000&#xff08;压缩品质更好&#xff0c;压缩率更高&#xff09;压缩模式&#xff1a;顺序…

如何进行无代码开发?有哪些无代码开发工具和无代码软件开发平台?

无代码开发是指不写代码&#xff0c;通过可视化工具进行应用程序开发。无代码开发让非技术用户通过拖拽和选择等简单操作&#xff0c;就能快速创建应用程序。 如何学习无代码开发 随着科技的不断发展&#xff0c;新的技术和工具不断涌现&#xff0c;无代码开发就是其中一种。掌…

C#中的async/await异步编程模型

前言 当谈到异步编程时&#xff0c;C#中的async/await是一个强大且方便的工具。它使得编写并发和异步操作变得更加简单和可读&#xff0c;同时提供良好的可维护性。本文将详细解释async/await的使用&#xff0c;以及如何在C#中有效地利用它来实现异步操作。 目录 前言1. async…

Win7 SP1 x64 Google Chrome 字体模糊

1 打开 Google Chrome &#xff0c;地址栏输入 chrome://version/ &#xff0c;字体模糊。 2 Microsoft Update Catalog 搜索现在更新 kb2670838 &#xff0c;安装&#xff0c;重启电脑。 3 打开 Google Chrome&#xff0c;地址栏输入 chrome://version/ &#xff0c;字体正常。…

Cache学习(4):Cache分配策略Cache更新策略Cache逐出策略

Cache的数据流 常用名词 Allocation 分配Eviction 驱逐分配策略和更新策略分别为当产生Cache miss和Cache hit的时候数据流的具体行为 1 Cache分配策略&#xff08;Cache Allocation Policy&#xff09; Cache的分配策略是指不同情况下为数据分配Cache Line的不同行为。Cac…

成为网络安全高手!教你如何做出专业级别的渗透测试

01、信息收集 1、域名、IP、端口 域名信息查询&#xff1a;信息可用于后续渗透 IP信息查询&#xff1a;确认域名对应IP&#xff0c;确认IP是否真实&#xff0c;确认通信是否正常 端口信息查询&#xff1a;NMap扫描&#xff0c;确认开放端口 发现&#xff1a;一共开放两…

Zookeeper分布式锁实现Curator十一问

前面我们通过Redis分布式锁实现Redisson 15问文章剖析了Redisson的源码&#xff0c;理清了Redisson是如何实现的分布式锁和一些其它的特性。这篇文章就来接着剖析Zookeeper分布式锁的实现框架Curator的源码&#xff0c;看看Curator是如何实现Zookeeper分布式锁的&#xff0c;以…

仿东郊到家预约按摩小程序开发;

在这个快节奏的现代社会&#xff0c;人们对便捷、高效的服务需求日益增大。正因如此&#xff0c;到家预约系统上门按摩小程序应运而生&#xff0c;它结合了互联网技术和传统按摩服务&#xff0c;不仅满足了人们对便捷按摩服务的需求&#xff0c;还为商家提供了全新的商业价值。…

【创建和排查隐藏进程和隐藏计划任务】

Window 创建隐藏进程和隐藏计划任务&#xff1a; 隐藏进程&#xff1a; 在Windows中&#xff0c;隐藏进程主要通过修改进程属性或使用第三方工具实现。以下是一个使用PowerShell脚本创建隐藏进程的示例&#xff1a; $Script {Start-Process -FilePath "notepad.exe"…

AI生成技术威胁版权保护,水印技术和法律完善是关键/安圭拉小岛以.ai域名注册赚得3000万美元 |魔法半周报​

我有魔法✨为你劈开信息大海❗ 高效获取AIGC的热门事件&#x1f525;&#xff0c;更新AIGC的最新动态&#xff0c;生成相应的魔法简报&#xff0c;节省阅读时间&#x1f47b; &#x1f525;资讯预览 AI生成技术威胁版权保护&#xff0c;水印技术和法律完善是关键 Sam Altman对…

海外网红挑选指南:6个方法轻松辨真伪,保障合作最佳效果!

随着社交媒体的飞速发展&#xff0c;海外网红营销已经成为品牌推广的重要渠道之一。然而&#xff0c;与日俱增的网红数量也给广告主带来了选择的困扰&#xff0c;因为市场上充斥着各种水分和虚假的网红。为了确保广告效果最大化&#xff0c;广告主需要学会识别真实的海外网红&a…

解锁Jira本地部署的数据中心版高级功能,打造高效、智能、精细化的项目管理

近日&#xff0c;在龙智携手Atlassian与JFrog共同举办的“大规模开发创新&#xff1a;如何提升企业级开发效率与质量”的线下研讨会中&#xff0c;龙智高级咨询顾问、Atlassian认证专家叶燕秀为大家带来了精彩演讲&#xff0c;解锁Jira Data Center版的诸多高级功能&#xff0c…

【探索Linux】—— 强大的命令行工具 P.17(进程信号 —— 信号保存 | 阻塞信号 | sigprocmask() | sigpending() )

阅读导航 引言一、阻塞信号1. 信号相关常见概念&#xff08;1&#xff09;信号递达&#xff08;2&#xff09;信号未决&#xff08;3&#xff09;阻塞信号&#xff08;4&#xff09;忽略信号 2. 信号在内核中的表示⭕信号在内核中的表示示意图 3. sigset_t &#xff08;数据类型…

四氧化三钴和三元前驱体废水回收钴 钴回收树脂技术

钴是一种稀有金属&#xff0c;也是非常重要的过渡金属材料&#xff0c;因其优异的物理、化学性质&#xff0c;以化学品和金属的形式&#xff0c;广泛应用于锂电池、硬质合金、超耐热合金、绝缘材料和磁性材料、工业催化剂、染料及氧化钴的生产过程中。 钴可以提高锂离子电池的稳…

k8s-deployment控制器 5

K8s控制器是Kubernetes&#xff08;简称k8s&#xff09;系统中一个重要的组成部分&#xff0c;它是一个管理Pod的中间层&#xff0c;可以创建和管理多个Pod副本&#xff0c;确保它们按照预定的数量和行为进行运行。 通过编写yaml文件将信息全部存到etcd中&#xff0c;控制器通…

NX二次开发UF_CURVE_create_arc 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_CURVE_create_arc Defined in: uf_curve.h int UF_CURVE_create_arc(UF_CURVE_arc_p_t arc_coords, tag_t * arc ) overview 概述 Creates an arc. You input the matrix tag, …

【超强笔记软件】Obsidian实现免费无限流量无套路云同步

【超强笔记软件】Obsidian如何实现免费无限流量无套路云同步&#xff1f; 目录 一、简介 软件特色演示&#xff1a; 二、使用免费群晖虚拟机搭建群晖Synology Drive服务&#xff0c;实现局域网同步 1 安装并设置Synology Drive套件 2 局域网内同步文件测试 三、内网穿透群…

PLC与组态王之间Modbus无线通讯的从站设置

本方案主要详述了在多台西门子300PLC与组态王之间Modbus无线通讯中如何设置从站。方案中所用到的无线通讯终端是DTD434MC——欧美系PLC专用无线通讯终端。 一、方案概述 无线Modbus网络组成如下&#xff1a; 二、测试背景 ● PC端组态软件版本&#xff1a;组态王6.55 ● 默…