Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用jQuery根据另一列的文本求和列总数_Javascript_Jquery_Html - Fatal编程技术网

Javascript 使用jQuery根据另一列的文本求和列总数

Javascript 使用jQuery根据另一列的文本求和列总数,javascript,jquery,html,Javascript,Jquery,Html,我有一段代码,用于根据不同列中的文本计算特定列中的总计。它工作得很好,但我正在学习,所以我想知道是否有办法整合这段代码。如您所见,我对每个列运行了两次,一次。第一列将在第一列中检查A,然后转到第二列并添加符合条件的行。与第二列类似,只是它查找B并添加第3列。是否有办法只运行一次每个函数,同时检查两列 JS: HTML: 这对你们中的一些人来说可能看起来很简单,但再一次,我现在只是在学习一些JS 谢谢 这类东西可能会有帮助 var trs = $('#'+tblID).find('tr'); v

我有一段代码,用于根据不同列中的文本计算特定列中的总计。它工作得很好,但我正在学习,所以我想知道是否有办法整合这段代码。如您所见,我对每个列运行了两次,一次。第一列将在第一列中检查A,然后转到第二列并添加符合条件的行。与第二列类似,只是它查找B并添加第3列。是否有办法只运行一次每个函数,同时检查两列

JS:

HTML:

这对你们中的一些人来说可能看起来很简单,但再一次,我现在只是在学习一些JS


谢谢

这类东西可能会有帮助

var trs = $('#'+tblID).find('tr');

var total1 = 0;
var total2 = 0;
$.each(trs, function(k, v) {
    if ($(v).text == "A"){
    total1 += parseInt($(v).parent('tr').find('td:eq(2)').text());
    }
    if ($(v).text == "B"){
    total2 += parseInt($(v).parent('tr').find('td:eq(3)').text())
    }
});

这样的东西可能会有帮助

var trs = $('#'+tblID).find('tr');

var total1 = 0;
var total2 = 0;
$.each(trs, function(k, v) {
    if ($(v).text == "A"){
    total1 += parseInt($(v).parent('tr').find('td:eq(2)').text());
    }
    if ($(v).text == "B"){
    total2 += parseInt($(v).parent('tr').find('td:eq(3)').text())
    }
});

您可以尝试以下方法:

var total = {A:{row:1,t:0},B:{row:2,t:0}};
$('#theTable tr').each(function() {
    $row = $(this);
    $.each(total, function(key, col) {
        rowFil = $row.filter(':contains("' + key + '")');
        col.t += (rowFil) ? +rowFil.find('td:eq(' + col.row + ')').text() : 0;
    });
});
$("#theTable tfoot tr:last td:eq(1)").text(total.A.t);
$("#theTable tfoot tr:last td:eq(2)").text(total.B.t);

您可以尝试以下方法:

var total = {A:{row:1,t:0},B:{row:2,t:0}};
$('#theTable tr').each(function() {
    $row = $(this);
    $.each(total, function(key, col) {
        rowFil = $row.filter(':contains("' + key + '")');
        col.t += (rowFil) ? +rowFil.find('td:eq(' + col.row + ')').text() : 0;
    });
});
$("#theTable tfoot tr:last td:eq(1)").text(total.A.t);
$("#theTable tfoot tr:last td:eq(2)").text(total.B.t);

这里是另一种方法-我总结了所有可能值的所有统计数据:


我还更新了一些标记,如下所示。代码可能不是很漂亮,但做了更多的工作,可以重构。

这里是另一种方法-我总结了所有可能值的所有统计信息:


我还更新了一些标记,如下所示。代码可能不是很漂亮,但是做了更多的工作,可以进行重构。

使用总和创建第二个表可以更容易地分析数据

JS


创建包含总和的第二个表可以更容易地分析数据

JS



向我们显示相关的HTML。请参阅编辑版本。谢谢作为旁注-最好给行a和B指定一些标识-为它们指定一个类。这将增加可读性并提高选择速度,至少我认为应该提高。我不能这样做,因为我在本例中使用了A和B来简化事情,但事实上,对于几个办公室来说,这将是一年中的几个月。最后,我将确定当前月份,并将每个办公室与当前月份匹配的行相加。同样,提供的代码工作得非常完美,我只想合并,因为我将使用的实际表要大得多,并且我希望使代码更高效。有意义吗?理想情况下,您应该有一个单独的数据结构来存储信息。使用复杂的jQuery选择器解析HTML树可能会减慢速度。即使使用本机document.querySelector函数也会提高您的速度,不过单独的数据结构会有更大帮助。向我们展示相关的HTML。请参阅已编辑的版本。谢谢作为旁注-最好给行a和B指定一些标识-为它们指定一个类。这将增加可读性并提高选择速度,至少我认为应该提高。我不能这样做,因为我在本例中使用了A和B来简化事情,但事实上,对于几个办公室来说,这将是一年中的几个月。最后,我将确定当前月份,并将每个办公室与当前月份匹配的行相加。同样,提供的代码工作得非常完美,我只想合并,因为我将使用的实际表要大得多,并且我希望使代码更高效。有意义吗?理想情况下,您应该有一个单独的数据结构来存储信息。使用复杂的jQuery选择器解析HTML树可能会减慢速度。即使使用本机document.querySelector函数也会提高速度,不过单独的数据结构会更有用。我喜欢你的方法,我会尝试一下。谢谢我喜欢你的方法,我试试看。谢谢这个也很好用,我喜欢统计部分。很遗憾,我不能选择两个好的答案。我选择上面这一个是因为它简单。谢谢嗯,您可以将这两种解决方案结合起来,得到一些非常特别的东西:谢谢,对于您的解决方案,我所做的唯一修改是将行$'theTable tbody tr'。每个函数e都更改为$'theTable tbody tr:not:first'。每个函数e。我有点奇怪。再次感谢。@cubangy,这是因为在您最初的标记中,thead和tbody被弄乱了-请看我的jsiddle,标记在那里是正确的。这个标记也很好用,我喜欢统计部分。很遗憾,我不能选择两个好的答案。我选择上面这一个是因为它简单。谢谢嗯,您可以将这两种解决方案结合起来,得到一些非常特别的东西:谢谢,对于您的解决方案,我所做的唯一修改是将行$'theTable tbody tr'。每个函数e都更改为$'theTable tbody tr:not:first'。每个函数e。我有点奇怪。再次感谢。@cubangy,这是因为在您最初的标记中,thead和tbody被弄乱了-请看我的JSFIDLE,这里的标记是正确的。
var totals = [];
$('#theTable tbody tr').each(function(e) {      
    var tds= $(this).find('td');
    var index = $(tds[0]).text();
    var pending = parseInt($(tds[1]).text(), 10);
    var denied = parseInt($(tds[2]).text(), 10);
    if (totals[index] == undefined)
        totals[index] = { Pending: 0, Denied: 0 };
    totals[index].Pending += pending;
    totals[index].Denied += denied;
});
for (var key in totals)
    $('#theTable tfoot').append('<tr><td>'+key+'</td><td>'+
                            totals[key].Pending+'</td><td>'+totals[key].Denied+'</td></tr>');
//make a list of unique months
var months = [];
$('#theTable tr td:nth-of-type(1)').each(function(){
  var month = $(this).text();
  if(months.indexOf(month) < 0) months.push(month);
});
console.log('months', months);

//make a data structure with sums
var data = {};
var tr = $('#theTable tr');
$.each(months, function(){
  var month = this;  
  data[month] = {
    pending: 0,
    denied: 0
  };
  tr.each(function(){
    var ch = $(this).children();
    var m = $(ch[0]).text();
    var pending = $(ch[1]).text();
    var denied = $(ch[2]).text();
    if(m == month) {
      data[month].pending += parseInt(pending);
      data[month].denied += parseInt(denied);
    }
  });
});
console.log('data', data);

//make a table with the data
var table = $('<table>');
table.append($('<tr>'+
  '<th>MONTH</th>'+
  '<th>PENDING</th>'+
  '<th>DENIED</th>'+
'</tr>'));
$.each(data, function(month){
  table.append($('<tr>'+
    '<td>'+month+'</td>'+
    '<td>'+data[month].pending+'</td>'+
    '<td>'+data[month].denied+'</td>'+
  '</tr>'));
});
$('body').append(table);