jQuery:列的SUM并将它们合并到一个单元格(用SUM结果替换它们)

时间:2013-07-07 18:31:18

标签: javascript jquery dom html-table

我想更改此表:

enter image description here

这可能用jQuery吗?

如果是,请向我发送类似的示例或任何解决方法。

编辑: 我知道如何阅读所有td的

$('#tableid tbody tr').each(function() {

    $.each(this.cells, function(){
        var celltext = $(this).text();
    });

});

此外,这可以将每个相似的值分组到一个单元格:

var $rows = $('#tableid tbody tr');
var items = [],
    itemtext = [],
    currGroupStartIdx = 0;
$rows.each(function(i) {
    var $this = $(this);
    var itemCell = $(this).find('td:eq(0)');
    var item = itemCell.text();
    itemCell.remove();
    if ($.inArray(item, itemtext) === -1) {
        itemtext.push(item);
        items.push([i, item]);
        groupRowSpan = 1;
        currGroupStartIdx = i;
        $this.data('rowspan', 1)
    } else {
        var rowspan = $rows.eq(currGroupStartIdx).data('rowspan') + 1;
        $rows.eq(currGroupStartIdx).data('rowspan', rowspan);
    }

});

$.each(items, function(i) {
    var $row = $rows.eq(this[0]);
    var rowspan = $row.data('rowspan');
    $row.prepend('<td rowspan="' + rowspan + '" style="white-space:nowrap;">' + this[1] + '</td>');
});

到目前为止这是PHP解决方案:

foreach($tabledata as $key => $val){
 $rowspan = (count($val) > 1 ? ' rowspan="'.count($val).'" ' : '');
   $spancount = 0;
   foreach($val as $vkey => $vval){
     $spancount++;
      echo '
      <tr>
      ';
       if($spancount == 1){
        echo '
        <td'.$rowspan.'>'.$key.'</td>
        ';
       }
      echo '
      <td>'.$vval[0].'</td>
      ';
      echo '
      <td>'.$vval[1].'</td>
      ';
     if($spancount == 1){
      echo '
      <td'.$rowspan.'>'.$sums[$key].'</td>
      ';
     }
      echo '</tr>
      ';
   }
}

2 个答案:

答案 0 :(得分:2)

嗯,我拍了一下。我冒昧地将类名放入TD和TR中,JavaScript可以被清理很多,但它确实有用。

var first_row = '<tr class="row"><td class="id">NULL</td></tr>';
var rowCount = 0;
var rowSum = 0;
$.each($('.row'), function (index, curRow) {
    if ($(first_row).find('.id').text() != $(curRow).find('.id').text()) {
        if (rowCount > 1) {
            $(first_row).find('.val').text(rowSum);
            $(first_row).find('.val').attr('rowspan', rowCount).css('background-color','silver');
            for (i = 0; i < rowCount; i++) {
                $(first_row).next('.row').find('.val').remove();
            }
        }
        first_row = $(curRow);
        rowSum = 0;
        rowCount = 0;
    }
    rowSum += parseInt($(curRow).find('.val').text());
    rowCount += 1;
});
if (rowCount > 1) {
    $(first_row).find('.val').text(rowSum);
    $(first_row).find('.val').attr('rowspan', rowCount).css('background-color','silver');
    for (i = 0; i < rowCount; i++) {
        $(first_row).next('.row').find('.val').remove();
    }
}

Link to Demo

答案 1 :(得分:1)

好的,哟说你只想要一个通用的方法,你不需要代码。

循环遍历行。如果col 0与previous不同,请将此行记为集合中的第一行,并将col 0的文本记为“previous”值。

如果col 0与前一个值相同,则将col 1的内容添加到集合的第一行的col 1,从该行删除col 1,并增加第一行中col 1的rowspan。

代码中的一个问题:

$rows.data("rowspan")

应该是

$this.children("td:eq(1)").attr("rowspan")