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