根据某一列属性合并element表格行


转自:https://www.cnblogs.com/chen-yi-yi/p/11224346.html

通过 span-method 绑定方法 objectSpanMethod方法
   this.getSpanArr(this.tableData); //this.tableData 指接口取到的数据
 // 2、 因为要合并的行数是不固定的,此函数是实现合并随意行数的功能
    getSpanArr(data) {
      this.spanArr = [];
      for (var i = 0; i < data.length; i++) {
        if (i === 0) {
          // 如果是第一条记录(即索引是0的时候),向数组中加入1
          this.spanArr.push(1);
          this.pos = 0;
        } else {
          if (data[i].parentCode === data[i - 1].parentCode) {
            // 如果parentCode相等就累加,并且push 0  这里是根据一样的parentCode匹配 
            this.spanArr[this.pos] += 1;
            this.spanArr.push(0);
          } else {
            // 不相等push 1
            this.spanArr.push(1);
            this.pos = i;
          }
        }
      }
    },
    // 3、合并行数
    objectSpanMethod({ row, column, rowIndex, columnIndex }) {
      // columnIndex === 0 找到第一列,实现合并随机出现的行数
      if (columnIndex === 0) {
        const _row = this.spanArr[rowIndex];
        const _col = _row > 0 ? 1 : 0;
        return {
          rowspan: _row,
          colspan: _col
        };
      }
    },

  可根据需求进行调整,上面的只是第一列合并,如果需求需要多列内容分别合并,且后面几列需要在前一列合并的基础上合并,该怎么做呢?

/**
     * 获取XXXXX列数据,判断上下两个数据是否一致
     * 将对应列数据初始化为空数组,第一个数据默认为1
     * 如果上下数据一致,则对应下标的数值+1,并同时push一个0
     * 示例:【1,1,2,0,1】则表示第三行数据合并,合并两行,并删除第四行数据
     */
    getMatterArr(data, name) {
      this.matterArr = [];
      for (var i = 0; i < data.length; i++) {
        if (i === 0) {
          this.matterArr.push(1);
          this.pos = 0;
        } else {
          if (data[i][name] === data[i - 1][name]) {
            this.matterArr[this.pos] += 1;
            this.matterArr.push(0);
          } else {
            this.matterArr.push(1);
            this.pos = i;
          }
        }
      }
    },
    /**
     * 获取XXXX列数据,判断上下两个数据是否一致
     * 将对应列数据初始化为空数组,第一个数据默认为1
     * 如果上下数据一致,则对应下标的数值+1,并同时push一个0
     * 示例:【1,1,2,0,1】则表示第三行数据合并,合并两行,并删除第四行数据
     */
    getReMatterArr(data, name) {
      this.reMatterArr = [];
      for (var i = 0; i < data.length; i++) {
        if (i === 0) {
          this.reMatterArr.push(1);
          this.index = 0;
        } else {
          if (data[i][name] === data[i - 1][name]) {
            this.reMatterArr[this.index] += 1;
            this.reMatterArr.push(0);
          } else {
            this.reMatterArr.push(1);
            this.index = i;
          }
        }
      }
    },
    /**
     * 合并行数据
     * 如果抵消事项数据第二个数据和前一个数据一样,则将其行进行合并
     * 报表事项则先判断对应的抵消事项是否合并,如果抵消事项处于合并状态,则其后面的报表事项允许合并
     * @param rowIndex第几行,columnIndex第几列
     * @param matterCode,第一个判断数据是否一致的字段
     * @param secondColumnKey 第二列判断是否一致的字段(该字段是由第一列标识 + 第二列标识合并得到的,由后台返回的 )
     */
    mergeColumn({ row, column, rowIndex, columnIndex }) {
      // columnIndex === 0 找到第一列,实现抵消事项合并
      if (columnIndex === 0) {
        this.getMatterArr(this.pageData, "matterCode");
        const _row = this.matterArr[rowIndex];
        const _col = _row > 0 ? 1 : 0;
        return {
          rowspan: _row,
          colspan: _col,
        };
      }
      if (columnIndex === 1) {
        //第二列报表事项的合并
        this.getReMatterArr(this.pageData, "secondColumnKey");
        const _row = this.reMatterArr[rowIndex];
        const _col = _row > 0 ? 1 : 0;
        return {
          rowspan: _row,
          colspan: _col,
        };
      }
    },

  getReMatterArr与getMatterArr 方法实际上是一个功能,但因为执行顺序的原因所以分开了,暂时没想到好的能合并到一起的方法。

  secondColumnKey参数实际上是第一列数据标识+第二列标识组合形成的标识,这样判断就会在第一列相同的(也就是合并的状态)时候才会进行第二列的合并。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM