【问题标题】:How to count td of single column with particular class with jQuery如何使用 jQuery 计算具有特定类的单列的 td
【发布时间】:2012-06-26 17:22:43
【问题描述】:

我有一个由代码生成的包含许多行和列的 html 表。 其中一些 TD 有一个 ON 类来设置不同的样式。

表格的结构有表头、正文和页脚行。

我想将每列中所有具有“ON”类的 TD 的数量相加,并将结果放在每列的最后一行(页脚)。

我该怎么做? (行列不是固定矩阵,所以事先不知道表有多少行列)

示例表:

data       | id_1 | id_2 | id_3 | ...
2012-06-20 | "ON" |      |      | ...
2012-06-21 | "ON" |      |      | ...
2012-06-22 | "ON" | "ON" |      | ...
2012-06-23 | "ON" |      | "ON" | ...
2012-06-24 | "ON" | "ON" |      | ...
tot        |   5  |   2  |   1  | ...

更新:混合使用 CRANIO 和 ALNITAK 的解决方案,结果如下:

var a = [];
$('td').each(function() {

    var n = $(this).index();
    if($(this).hasClass('on')){
       a[n] = a[n] ? a[n] + 1 : 1;
    }else{
       a[n] = a[n] ? a[n] : 0;
    }
});

var t = $('<tr>').appendTo('#tableID > tfoot');
$.each(a, function(i, n) {
    t.append($('<td>', { text: i === 0 ? 'total' : n }));
});

通过这种方式,您可以在没有 TD.on 的列中添加零(或空格 ---> a[n] = a[n] ? a[n] : '';

附:也可用于在不同的 TD.class 上创建不同的总行,根据不同的类附加更多的 TR。

【问题讨论】:

  • 如果计数为零,是否可以接受空白总数?
  • @Alnitak yes 是可以接受的(如果 > 0 则只需要总数)
  • @keebOo 太好了,这就是我的回答:)
  • 聪明的编辑,我非常感谢您混合了两种解决方案(我的和@Alnitak 的),并提出了您自己的解决方案,使其可供所有用户使用......绝对赞成: )
  • @Cranio 是的,这是两个答案的完美结合。不过,第一个循环可能要简洁得多(请参阅我的更新答案)。

标签: jquery html-table


【解决方案1】:

http://jsfiddle.net/cranio/RTugL/

我试过这张桌子:

<table>
<tr>
    <td></td>
    <td></td>
    <td class='on'>.</td>
    <td class='on'>.</td>
</tr>    

<tr>
    <td class='on'>.</td>
    <td class='on'>.</td>
    <td></td>
    <td></td>
</tr>    
<tr>
    <td></td>
    <td class='on'>.</td>
    <td class='on'> .</td>
    <td class='on'>.</td>
</tr>    </table>

使用此代码:

var a = new Array();
$("table tr").each(
    function (i,e)
    {
        $(e).find("td").each(
            function (i,e)
            {
                if (!a[i]) a[i] = 0;
               if ($(e).hasClass("on")) a[i]++;   
            });});
var lastrow = $("<tr>");
$.each(a, function(i,e) { lastrow.append("<td>"+e+"</td>");});
$("table").append(lastrow);

我所做的是计算 TD.on 在数组中的出现次数,更新为 每个“位置”。 ​

【讨论】:

  • 此示例计算所有列。如果您想排除某些列,请告诉我。
  • 演示很棒,但也请在您的答案中发布代码 - 有时 jsfiddle 不可用。 (无需发布您设置的任何基础设施只是为了使小提琴工作。)
  • 在这种情况下,我已经发布了基础设施,以确保我以正确的方式解释了 OP 的请求,@nnnnnn
  • @Cranio ...更长但有用(Alnitak 版本的小错误:如果末尾有一些空列,则不添加 TD);)使用此
  • @keebOo 公平地说,我认为你使用的我的答案比他的多;-)
【解决方案2】:

这是我目前能想到的最短代码:

var a = [];
$('td.on').each(function() {
    var n = $(this).index();
    a[n] = a[n] ? a[n] + 1 : 1;
});

var t = $('<tr>').appendTo('table');
$.each(a, function(i, n) {
    t.append($('<td>', { text: i === 0 ? 'total' : n }));
});​

http://jsfiddle.net/alnitak/6XTvN/ 的工作示例

编辑以确保不匹配的列的空单元格(和零)这里是第一个代码块的变体:

var a = [];
$('td').each(function() {
    var n = $(this).index();
    a[n] = a[n] || 0;
    a[n] += $(this).hasClass('on');
});

我的第一个版本有一个小缺陷,即没有匹配单元格的列会在a 中产生未定义的值,从而导致空白单元格,但更糟糕的是,对于没有匹配单元格的任何尾随列,单元格会完全丢失。

【讨论】:

  • 比我的短很多,好,赞 :) 没想到.index()
  • @Cranio mine 也处理标题栏 ;-)
  • 没关系,但是在 ajax 成功时给我一个错误(真的不知道为什么,也因为在 jsfiddle 上它是正确的)。但使用“计数数组”的第一部分解决并将结果写入页脚行。 :) 谢谢
  • @Alnitak 非常好(如果有一个如此清晰和优雅的解决方案,我讨厌使用),我将再次更新代码。谢谢。
猜你喜欢
  • 1970-01-01
  • 2014-05-25
  • 2021-02-23
  • 1970-01-01
  • 2012-05-08
  • 1970-01-01
  • 2018-09-09
  • 2020-10-22
  • 1970-01-01
相关资源
最近更新 更多