Js 合并 table 行 的实现方法
Js 合并 table 行 的实现方法
需求如下:
某公司的员工档案,如下, 经理看员工的信息不是很清晰:
|
姓名 |
所在学校 |
毕业时间 |
|
张三 |
小学 |
2000 |
|
张三 |
中学 |
2006 |
|
张三 |
大学 |
2010 |
|
李四 |
小学 |
2000 |
|
李四 |
中学 |
2006 |
|
王五 |
小学 |
2006 |
所以要求要求姓名一列如果发现挨着的名字相同的话,将其合并为一行,如下图所示:
|
姓名 |
所在学校 |
毕业时间 |
|
张三 |
小学 |
2000 |
|
中学 |
2006 |
|
|
大学 |
2010 |
|
|
李四 |
小学 |
2000 |
|
中学 |
2006 |
|
|
王五 |
小学 |
2006 |
这样看起来是不是很清晰...
解决思路
1. 首先我想封装一个方法,这个方法应该是:
a) 操作哪一个table
b) 这个table的列(要合并的列)
c) 从第几行开始合并(如:表头行不参与合并),
d) 结束到第几行(如:分页行不参与合并)
2. 具体内部方法的实现
a) 我想先用一个集合来存储相同的名称的个数(如:[3,2,1] 也就是 [张三的个数,李四的个数,王五的个数])
b) 然后循环table的行数,如果 数组中的数大于1,我要将大于1的td给删掉。
3. 在循环的同时添加条件。
以上就是我要解决这个问题的主要思路.那大家就先看看我的具体代码吧:
- /**
- data格式{'table':$('tableId'),'columnId':'0','startRowNumber':'1','endRowNumber':}
- */
- function initRowsPan(data) {
- //判断table是否存在
- if(!data.table)
- {
- return;
- }
- //判断是否存在操作的列编号
- if(!data.columnId||data.columnId<0)
- {
- return;
- }
- //记录开始的行号,如果为空,则默认从第0行开始
- var tStartNumber=data.startRowNumber;
- if(!tStartNumber||tStartNumber<0)
- {
- tStartNumber=0;
- }
- //记录table的所有hang集合
- var tableRows = data.table.rows;
- //记录结束的行号,如果为空,则默认为table的行号
- var tEndNumber=data.endRowNumber;
- if(!tEndNumber||tEndNumber<=0)
- {
- tEndNumber=tableRows.length;
- }
- else
- {
- //给传来的编号加1,因为表格的行编号是从0开始.
- tEndNumber+=1;
- }
- //得到相同内容的行数的集合
- var totalcount = new Array();
- //临时变量,循环记录表格中td的内容,用来判断td中的value是否发生修改
- var tTdValue = "";
- //临时变量,再循环时,如果td的值相同,那么变量加1, 否则将临时变量压入集合中
- var tRowsCount = 1;
- //存储table 的所有行数
- for ( var i = data.startRowNumber; i < tEndNumber; i++)
- {
- //首先拿出来td的值
- var tTdInner=tableRows[i].cells[data.columnId].innerHTML.trim();
- //如果是第一次走循环,直接continue;
- if (i == data.startRowNumber)
- {
- tTdValue = tTdInner;
- continue;
- }
- //如果当前拿出来的值和出处的值相同,那么将临时数量加1
- if (tTdValue == tTdInner)
- {
- tRowsCount++;
- }
- else
- {
- //否则添加到集合里面
- totalcount.push(tRowsCount);
- //并且将当前的td中的value赋给变量
- tTdValue = tTdInner;
- //数量清为1
- tRowsCount = 1;
- }
- //判断是否是循环的最后一次,如果是最后一次那个直接将当前的数量存储到集合里面
- if (i == tEndNumber -1)
- {
- totalcount.push(tRowsCount);
- }
- }
- //临时变量,再循环中判断是否和数组中的一项值相同
- var tNum = 0;
- //注意这个循环是倒着来的
- for (var i = tEndNumber - 1; i >= data.startRowNumber; i--)
- {
- //临时变量,存储td
- var tTd=tableRows[i].cells[data.columnId];
- tNum++;
- //如果发现tNum和数组中最后一个值相同,那么就可以断定相同的td已经结束[只是其中一个]
- if (tNum == totalcount[totalcount.length - 1])
- {
- //给当前td添加rowSpan属性
- tTd.setAttribute("rowSpan",totalcount[totalcount.length - 1]);
- //将数组的最后一个元素弹出
- totalcount.pop();
- tNum = 0;
- }
- else
- {
- //删除当前td
- tableRows[i].removeChild(tTd);
- }
- }
- }
在onload事件里面调用函数
总结
其实每一个问题都会有很多的解决办法,这个是我在前台实现,其实大家也还可以在页面里面添加判断,来输出效果. 我们在做的时候多想想,多动动脑子,怎样才能使我们做事情更方便一些,会更节省时间,每次多积累,多总结,这样我们就会提高很多…
这是晚辈的第三篇技术文章,文章写的不是很好,希望各位前辈多多指教,
Js 合并 table 行 的实现方法的更多相关文章
- JS合并两个数组的方法
JS合并两个数组的方法 我们在项目过程中,有时候会遇到需要将两个数组合并成为一个的情况.比如: var a = [1,2,3]; var b = [4,5,6]; 有两个数组a.b,需求是将两个数组合 ...
- 使用js合并table中的单元格
用primefaces做的报表,领导要求合并相同内容的单元格,但是primefaces没有找到可以合并单元格的组件,想来想去,只有页面加载后用js合并了. http://blog.csdn.net/d ...
- SQL中合并多行记录的方法总汇
-- =============================================================================-- Title: 在SQL中分类合并数 ...
- JS合并数组的几种方法及优劣比较
本文属于JavaScript的基础技能. 我们将学习结合/合并两个JS数组的各种常用方法,并比较各种方法的优缺点. 我们先来看看具体的场景: var q = [ 5, 5, 1, 9, 9, 6, 4 ...
- [Js/Jquery]table行转列
摘要 在使用ews调用exhange的收件箱的并在h5页面显示邮件详情的时候,因为返回的每封邮件的内容都是htmlbody,没有textbody.每封邮件又没什么规律,用正则表达式来匹配内容并不合适, ...
- js合并table指定列
function MergeTableCell(tableId, startRow, endRow, col) { var tb = document.getElementById(tableId); ...
- 探讨JS合并两个数组的方法
我们在项目过程中,有时候会遇到需要将两个数组合并成为一个的情况. 比如: var a = [1,2,3]; var b = [4,5,6]; 有两个数组a.b,需求是将两个数组合并成一个.方法如下: ...
- 转:探讨JS合并两个数组的方法
我们在项目过程中,有时候会遇到需要将两个数组合并成为一个的情况. 比如: var a = [1,2,3]; var b = [4,5,6]; 有两个数组a.b,需求是将两个数组合并成一个.方法如下: ...
- [转] 探讨JS合并两个数组的方法
我们在项目过程中,有时候会遇到需要将两个数组合并成为一个的情况. 比如: 1 2 var a = [1,2,3]; var b = [4,5,6]; 有两个数组a.b,需求是将两个数组合并成一个.方法 ...
随机推荐
- IIS 发布webservice 需要用户名和密码访问 解决
今天,我在IIS上发布了一个自己写的webservice,然后我在远程通过浏览器来访问这个webservice的时候出现一个登录界面如下 之前我朋友发布webservice的时候也出现过一次,那次好 ...
- ExtJS浏览器对象模型BOM——命名空间和用户代理对象、Cookie
BOM(浏览器对象模型(BrowserObjectModel)),允许访问和操控浏览器窗口.研发者通过使用BOM,可移动窗口.更改状态栏文本.执行其它不与页面内容发生直接联系的操作. 本文将从ExtJ ...
- 《Beginning Java 7》 - 2 - Cloning 克隆
Cloning 分两类:影子克隆 shallow cloning 深度克隆 deep cloning * 调用 clone() 需要 implments Cloneable.此函数为 protecte ...
- SDOI2013 淘金
题目链接:戳我 昨天做的题了,今天补一发题解. 是一个比较奇怪的数位DP.详细的我还是写代码注释里好了,感觉直接说不好描述. 代码如下: #include<iostream> #inclu ...
- Blocks to Cubes
Bholu the Pandit on this New Year wanted to divide his Cuboidal Packaging block into cubes. But he l ...
- logstash--使用ngxlog收集windows日志
收集流程 1nxlog => 2logstash => 3elasticsearch 1. nxlog 使用模块 im_file 收集日志文件,开启位置记录功能 2. nxlog 使用模块 ...
- 【C/C++】10分钟教你用C++写一个贪吃蛇附带AI功能(附源代码详解和下载)
C++编写贪吃蛇小游戏快速入门 刚学完C++.一时兴起,就花几天时间手动做了个贪吃蛇,后来觉得不过瘾,于是又加入了AI功能.希望大家Enjoy It. 效果图示 AI模式演示 imageimage 整 ...
- linux上的常用的进程与内存优化命令
进程 ps命令 f 以树状结构显示 u 显示详细信息 a 显示所有进程 -A 显示所有进程 -u 用户名 是显示该用户下的进程 -l 更多进程详细信息 例子1. 以树状结构显示root用户下进程的详细 ...
- jquery中获取单选标签redio的val
$('input:radio:checked').val();
- Java非静态代码块和静态代码块
类中存在两种特殊的代码块,即非静态代码块和静态代码块,前者是直接由 { } 括起来的代码,而后者是由 static{ } 括起来的代码. 非静态代码块在类初始化创建实例时,将会被提取到类的构造器中执行 ...