Javascript在表中添加和平均值时如何处理NAN
我正在尝试编写一个高效的javascript函数,该函数将循环遍历一个表,获取所有数字,并用字符串忽略所有tds。将添加列并求平均值,并为每个列追加行 我有这项工作的基本功能。然而,如果该表不包含字符串,则结果与预期一致。当表中确实包含字符串时,该列的总数和平均值相差甚远,我不确定答案是如何计算的。我希望有人能帮我找到一种方法,可以忽略所有这些值,并创建一种更有效的方法来编写这个函数 最后,我希望能够通过简单地传入表来调用此函数,例如,Javascript在表中添加和平均值时如何处理NAN,javascript,jquery,Javascript,Jquery,我正在尝试编写一个高效的javascript函数,该函数将循环遍历一个表,获取所有数字,并用字符串忽略所有tds。将添加列并求平均值,并为每个列追加行 我有这项工作的基本功能。然而,如果该表不包含字符串,则结果与预期一致。当表中确实包含字符串时,该列的总数和平均值相差甚远,我不确定答案是如何计算的。我希望有人能帮我找到一种方法,可以忽略所有这些值,并创建一种更有效的方法来编写这个函数 最后,我希望能够通过简单地传入表来调用此函数,例如,buildRows(table) 以下是我目前得到的信息:
buildRows(table)
以下是我目前得到的信息:
//用于生成总计行和平均行的函数
函数buildRow($element){
var结果=[];
$($element).find('tbody tr').each(function(){
//忽略为标签保留的第一列
$('td:not(:first'),this).each(函数(索引,val){
如果(!result[index])result[index]=0;
结果[index]+=parseInt($(val.text());
});
});
//获取行的总金额
var rowCount=$($元素).find('tbody tr').length;
//添加平均行
$($元素)。追加(“”);
$($element).find('tr').last().append('+'平均'+'');
$(结果)。每个(函数(){
$($element).find('tr').last().append(“”+this/rowCount+“”);
});
//添加总行数
$($元素)。追加(“”);
$($element).find('tr').last().append('+'总计'+'');
$(结果)。每个(函数(){
$($element).find('tr').last().append(“”+this+“”);
});
}
//理想函数调用
变量tableOne=$('.tableOne');
buildRow(表一);
变量tableTwo=$('.tableTwo');
buildRow(表二)代码>
表格{
边框:1px实心#333;
填充:10px;
右边距:5px;
}
表tr:第n个子项(奇数){
背景色:#E0;
}
表td{
填充:10px;
边框:1px实心#555;
文本对齐:居中;
}
第一排
45
23.356
88
第二排
111440.568
115555
4.21598
第三排
27
42
144487.11
第四排
23.356
125%
778978523.36
第一排
45
23.356
你好
第二排
111440.568
115555
4.21598
第三排
狗
真的
144487.11
第四排
23.356
125%
778978523.36
不能只对每个值执行parseInt
,它有时会将字符串转换为奇怪的数字。你必须先检查它是否是一个无效的数字,然后再求和。我想到一个正则表达式或类似的东西,未经测试
var v = $(val).text();
if(v.match(/^[\s0-9\.]+$/)){}
不能只对每个值执行parseInt
,它有时会将字符串转换为奇怪的数字。你必须先检查它是否是一个无效的数字,然后再求和。我想到一个正则表达式或类似的东西,未经测试
var v = $(val).text();
if(v.match(/^[\s0-9\.]+$/)){}
既然您使用jQuery,为什么不直接使用jQuery内置的is numeric条件检查函数$.isNumeric
,它将解析出几乎所有您不需要的数据
// true (numeric)
$.isNumeric( "-10" )
$.isNumeric( "0" )
$.isNumeric( 0xFF )
$.isNumeric( "0xFF" )
$.isNumeric( "8e5" )
$.isNumeric( "3.1415" )
$.isNumeric( +10 )
$.isNumeric( 0144 )
// false (non-numeric)
$.isNumeric( "-0x42" )
$.isNumeric( "7.2acdgs" )
$.isNumeric( "" )
$.isNumeric( {} )
$.isNumeric( NaN )
$.isNumeric( null )
$.isNumeric( true )
$.isNumeric( Infinity )
$.isNumeric( undefined )
资料来源:
示例:既然您使用jQuery,为什么不使用jQuery内置的is numeric条件检查函数$。isNumeric
将解析出几乎所有您不需要的数据
// true (numeric)
$.isNumeric( "-10" )
$.isNumeric( "0" )
$.isNumeric( 0xFF )
$.isNumeric( "0xFF" )
$.isNumeric( "8e5" )
$.isNumeric( "3.1415" )
$.isNumeric( +10 )
$.isNumeric( 0144 )
// false (non-numeric)
$.isNumeric( "-0x42" )
$.isNumeric( "7.2acdgs" )
$.isNumeric( "" )
$.isNumeric( {} )
$.isNumeric( NaN )
$.isNumeric( null )
$.isNumeric( true )
$.isNumeric( Infinity )
$.isNumeric( undefined )
资料来源:
示例:您需要使用var reg=/^\d+$/;检查td值是否为整数代码>您需要使用var reg=/^\d+$/;检查td值是否为整数
如果您想要更准确的信息,可以忽略Nan
并使用Number
而不是parseInt
:
$('td:not(:first)', this).each(function(index, val) {
if (!result[index]) result[index] = 0;
var num = Number($(val).text());
num = isNaN(num) ? 0 : num;
result[index] += num;
});
如果您想要更准确的信息,可以忽略Nan
s并使用Number
而不是parseInt
:
$('td:not(:first)', this).each(function(index, val) {
if (!result[index]) result[index] = 0;
var num = Number($(val).text());
num = isNaN(num) ? 0 : num;
result[index] += num;
});
要记住两件事:
parseFloat
将捕获浮点和整数
在处理数字时,您可以使用|0
来破解忽略错误值,并将其替换为0
除此之外,我对您的代码做了一些修改,将必要的元素放入变量中:
//用于生成总计行和平均行的函数
函数buildRow($table){
var结果=[],
$tbody=$table.find('tbody'),
$rows=$tbody.find('tr'),
row_count=$rows.length;
$rows.each(函数(){
//忽略为标签保留的第一列
var$cells=$('td:not(:first'),这是);
$cells.每个(函数(索引,单元格){
如果(!结果[索引])
结果[指标]=0;
结果[索引]+=parseFloat($(单元格).text()| | 0);
});
});
//添加平均行
变量$avg_row=$('');
$avg_row.append('Averages');
$.each(结果,函数(){
$avg_row.append(“”+(此/行计数)+“”);
});
$tbody.append($avg_row);
//添加总行数
变量$total_row=$('');
$total_row.append('Totals');
$.each(结果,函数(){
$total_row.append(“”+此+“”);
});
$tbody.append($total_row);
}
//理想函数调用
变量$tableOne=$('.tableOne');
buildRow(表一);
变量$tableTwo=$('.tableTwo');
buildRow(表二)代码>
表格{
边框:1px实心#333;
填充:10px;
右边距:5px;
}
表tr:第n个子项(奇数){
背景色:#E0;
}
表td{
填充:10px;
边框:1px实心#555;
文本对齐:居中;
}
第一排
45
23.356
88
第二排
111440.568
115555
4.21598
第三排
27
42
144487.11
第四排
23.356
125%
778978523.36
第一排
45
23.356
你好
第二排
111440.568
115555
4.21598
第三排
狗
真的
144487.11
第四排
23.356