layui table表格单元格动态合并,并设置隔行变色,此代码只针对嵌套数组只有一层的时候有效,多个数组嵌套还在冥想当中!!

需求描述

我们知道在layui插件官方平台有个可以无限极单元格合并的模块,但是其核心理念是针对多个相同数据进行合并,并且也非常好用,数据结构不存在嵌套结构。

但是偶尔数据也有嵌套的时候,哪怕只有一层数据结构嵌套的话,上面的方法就不好使了,并且我们在不抛弃layui.table的时候照样可以使单元格进行合并,那就请看下图:

整个代码如下:

layui.define (function (exports) {
var $ = layui.jquery,
mod = {
render: function (myTable) {
var tableBox = $ (myTable.elem).next ().children ('.layui-table-box'),
$main = tableBox
.children ('.layui-table-body')
.children ('table')
.children ('tbody')
.children ('*[data-index]');
$main.each (function (pindex) {
var td = $ (this).children ();
td.each (function (index) {
var pp = $ (this).find ('p');
pp.parents ('td').addClass ('abc');
if (!pp.parents ('td').siblings ().hasClass ('abc')) {
pp.parents ('td').siblings ().attr ('rowspan', pp.length);
} else {
pp.parents ('td').removeAttr ('rowspan');
}
}); if ($ (this).find ('td').hasClass ('abc')) {
var hasAbc = $ (this).find ('.abc'), arr = [], len = 0;
hasAbc.each (function (im) {
var iem = $ (this).find ('p');
len = iem.length;
iem.each (function (ia, item) {
arr.push (item);
});
$ (this).find ('P:gt(0)').remove ();
});
var dataArr = spFn (arr, len); //生成tr
dataArr.reverse ().forEach (function (item, index) {
if (index != dataArr.length - 1) {
var str = '<tr flag=' + pindex + '>';
for (var i = 0; i < item.length; i++) {
str += "<td align='center'>";
str += "<div class='layui-table-cell'>";
str += $ (item[i]).html ();
str += '</div>';
str += '</td>';
}
str += '</tr>'; if (td.find ('p').parents ('tr').length > 0) {
td.find ('p').parents ('tr').next ().before (str);
}
}
});
}
});
var $allmain = tableBox
.children ('.layui-table-body')
.children ('table')
.children ('tbody')
.children ('tr');
var findTrBs = function (flag) {
var className;
$allmain.each (function () {
if ($ (this).attr ('data-index') == flag) {
className = $ (this).attr ('class');
}
});
return className;
};
//单元格合并以后 设置隔行变色
$allmain.each (function (i) {
if ($ (this).attr ('data-index')) {
if ($ (this).attr ('data-index') % 2 == 0) {
$ (this).addClass ('even');
} else {
$ (this).addClass ('odd');
}
} else {
$ (this).addClass (findTrBs ($ (this).attr ('flag')));
}
});
},
}; exports ('tableMerge', mod);
});

具体思路:

1、首先我们需要先把table表格数据字段设置成template

2、在页面上设置模板
<script type="text/html" id="nownr">
{{# layui.each(d.corrNowConArr,function(index,item){ }}
<p>{{item.con}}</p>
{{# });}}
</script>
3、通过特殊元素标记将此数据追加到对应tr的下面,此过程我们需要做一些转换
//将数组分割成 几个几个组合的多维数组
//[1,2,3,4] 组合成[[1,2],[3,4]]
function spFn (arr, len) {
const arr1 = arr.reduce ((init, item, index) => {
index % len === 0
? init.push ([item])
: init[init.length - 1].push (item);
return init;
}, []);
return senFun (arr1);
}

4、将遍历好的元素标记按照 纵向排列

//数组竖向排列
//[[1,2],[3,4]] 组合成[[1,3],[2,4]]
function senFun (data) {
let final = [];
let length = Math.min (...data.map (arr => arr.length));
for (let i = 0; i < length; i++) {
let tmp = [];
for (let j = 0; j < data.length; j++) {
tmp.push (data[j][i]);
}
final.push (tmp);
}
return final;
}

最终渲染结构如图:

切记:此案例不支持多项嵌套 !写的不好还请见谅。如有问题可以留言

下面奉上支持多层单元格合并的链接:https://fly.layui.com/extend/tableMerge/



layui table表格单元格动态合并,并设置隔行变色的更多相关文章

  1. jQuery实现HTML表格单元格的合并功能

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  2. easyUI datagarid单元格动态合并

    第二列根据第一列合并,第三列根据第二列合并.层级关系. /* * tableID表格的id * colList要合并的字段例如:"overcount,totalcount" */ ...

  3. freemarker实现单元格动态合并-行合并

    项目需求:项目中有个需求,需要将一些数据库中的数据根据需求导出,生成一个word,研究了一些技术,其中包括POI.freemaker,对比了一下实现过程及技术难度没最终使用了freemaker; 原始 ...

  4. jsp table 表格单元格编辑示例

    列表单元格: //两个 隐藏的 input, 第一个存 记录 id, 单元格内容是排序码 : <td id="ordinal"><%=ordinal%> & ...

  5. layui更新表格单元格数据口,更新单元格的内容

    //监听工具条 table.on('tool(edit)', function(obj){ var data = obj.data; if(obj.event === 'getinvitation') ...

  6. html如何设置表格单元格内容垂直居中?

    父元素设置为表格的单元格元素td,而在表格单元格中的元素设置vertical-align: middle; 对父容器(td)使用:display: table-cell 其内子元素使用:vertica ...

  7. NG-ZORRO + angular-cli11 表格横纵向单元格合并,按需设置背景色,解决动态合并单元格动态colspan情况下,nzLeft固定列失效问题,也适用VUE,REACT

    NG-ZORRO + angular-cli11 实现表格横纵向单元格合并,按需设置背景色,并解决动态合并单元格动态colspan情况下,nzLeft固定列失效问题 HTML代码 <!-- 1. ...

  8. 使用js方法将table表格中指定列指定行中相同内容的单元格进行合并操作。

    前言 使用js方法对html中的table表格进行单元格的行列合并操作. 网上执行此操作的实例方法有很多,但根据实际业务的区别,大多不适用. 所以在网上各位大神写的方法的基础上进行了部分修改以适合自己 ...

  9. 如何让elemengUI中的表格组件相同内容的单元格自动合并

    1. 前言 这两天在工作中遇到这样一个需求:将某个Excel中的数据在页面上以表格形式展示出来,并且尽量保持数据层级与Excel中一致.在原始Excel文件中,对每一行相同的数据都进行了合并,使得数据 ...

  10. JavaScript动态改变表格单元格内容的方法

    本文实例讲述了JavaScript动态改变表格单元格内容的方法.分享给大家供大家参考.具体如下: JavaScript动态改变表格单元格的内容,下面的代码通过修改单元格的innerHTML来修改单元格 ...

随机推荐

  1. 超级干货!Air780E的串口通信分享

    ​ 猛然发现,Air780E的串口通信还没分享,难怪已经有小伙伴提出了要求! 那我们来讲解低功耗4G模组Air780E的串口通信的基本用法,小伙伴们,学起来吧! 一.硬件准备  ​ 780E开发板一套 ...

  2. 2023NOIP A层联测16 T3 货物运输

    2023NOIP A层联测16 T3 货物运输 题目描述说这是一个仙人掌图,通常将问题转换为环和树的问题在使用圆方树来解决. 树解法 令 \(a_i=s_i-\frac{\sum s_i}{n}\) ...

  3. 【Flink 日常踩坑】Could not find ExecutorFactory in classpath

    Description 一段简单的 FlinkSQL 程序,在 IDE 中运行没问题,但是 maven 打包后发布到终端启动却报错了. import org.apache.flink.configur ...

  4. Linux中更新系统时间、同步系统时间和硬件时间

    更新系统的时间 ​ 1.手动修改 ​ date -s # 不建议 ​ 2.时间同步服务器 ​ ntpdate # 需要安装命令 yum -y install ntpdate ​ [root@oldbo ...

  5. vue-element-admin 左侧的导航栏固定展开

    项目需要把左侧的导航栏固定打开,不关闭我们只需要打开store-modules-app.js文件中,把下面的代码给修改就可以了

  6. (Redis基础教程之八) 如何在Redis中管理Sets

    如何在ubuntu18.04上安装和保护redis 如何连接到Redis数据库 如何管理Redis数据库和Keys 如何在Redis中管理副本和客户端 如何在Redis中管理字符串 如何在Redis中 ...

  7. golang之常用标准库汇总

    1. import "runtime/debug" func Stack func Stack() []byte Stack 返回格式化的go程的调用栈踪迹. 对于每一个调用栈,它 ...

  8. Vue.js 组件数据交互

    1.前言 本节讲述组件之间如何进行数据交互 2.props属性与非 prop 的属性 父组件通过属性绑定的形式传值给子组件,这种传值分2种 类别 含义 说明 props 子组件本身已经通过props定 ...

  9. canvas(一)描边与填充

    1.画布大小 canvas默认的大小是 300*150,通过操作width/height属性可以设置画布的大小,属性值只能是具体是像素值,而不能是百分比. <body> <div c ...

  10. 使用arcpy向server端发布服务

    import arcpy import os # Set output file names outdir = r"D:" service = "MapImageShar ...