Obteniendo la sum y el promedio en javascript

Cómo obtener la sum y el promedio de la última columna. En mi código no obtendrá el valor correcto si la tabla tiene una, dos y tres filas. Esto funciona solo en la tabla con 4 filas. Sé algo incorrecto con mi código, pero No puedo entender cómo funciona el bucle dentro de la función .each.

Nota importante: esto se ejecuta con el evento keyup para actualizar los datos de la tabla. No es solo una visualización. Para ser exactos, es un formulario de actualización.

Salida deseada

Item | value1 | value 2 | value3 |value 4 | Average 01 90 88 87 80 82.25 Total average 82.25 result of 82.25/1 number of row if two rows Item | value1 | value 2 | value3 |value 4 | Average 01 90 88 87 80 82.25 02 80 85 86 84 83.75 Total average 83 result of (82.25+83.75)/2 number of rows 

Pero el resultado sale con múltiples bucles.

 Here is the console.log(totalAverage) 86.25 176 264.75 353.5 442.25 86.25 176 264.75 353.5 442.25 

Problema: cómo suprimir u omitir estos valores innecesarios. Solo necesito que el 86.25 se muestre en total-ave.Nota: esto es solo una fila en este momento y ya he encontrado esta falta de cálculo, ¿cuánto más si la tabla tiene varias filas?

Html

  

Card

Subjects First Grading Second Grading Third Grading Fourth Grading Average @foreach($update_card['AllGrade'] as $subject) {!! Form::hidden('grade_id[]',$subject['grade_id']) !!} {!! $subject->subject !!} {!! Form::text('term_1[]',$subject->term_1,['class'=>'form-control','name[]'=>'term_1','id[]'=>'term_1','value'=>'0']) !!} {!! Form::text('term_2[]',$subject->term_2,['class'=>'form-control','name[]'=>'term_2','id[]'=>'term_2','value'=>'0']) !!} {!! Form::text('term_3[]',$subject->term_3,['class'=>'form-control','name[]'=>'term_3','id[]'=>'term_4','value'=>'0']) !!} {!! Form::text('term_4[]',$subject->term_4,['class'=>'form-control','name[]'=>'term_4','id[]'=>'term_4','value'=>'0']) !!} Average @endforeach Total Average: {!! Form::text('scholar_GPA',$update_card->scholar_GPA,['class'=>'form-control total-ave','name' => 'total-ave','id' => 'total-ave','value' => '0']) !!}

Fragmento de Javascript

 $("input").on("keyup", function(){ $("tbody tr").each(function() { var col=1; var tr =1; var t = 0; var a = 0; $(this).children('td').not(':last').each(function () { var number = ($(this).children('input').length == 0) ? $(this).html() : $(this).children('input').first().val(); // console.log(number); // console.log(col); t += parseInt(number); // console.log(t); a = t/col; col++; }); $(this).children('td').last().html(a);//last td of the row // console.log(a); col=1; tr++; }); calcTotalave(); }); // calculate total average function calcTotalave() { var totalAve = 0; var tot=0; var c = 2; var count =0; $( ".average" ).each(function() { // console.log($(this).html()); var thisAve = parseFloat($(this).html()); if(!thisAve || thisAve === NaN || thisAve == "") { thisAve = 0; } totalAve += thisAve; //alert('count'+thisAve+totalAve); console.log(totalAve); count++; }); c++; totalAve = totalAve/c; // console.log(totalAve); $("#total-ave").val(totalAve); } 

ACTUALIZADO : juegue abajo con los comentarios, presione la barra espaciadora para ejecutar, según la función siguiente. el violín está hecho para recorrer y calcular celdas por fila, por lo que no se .average clase media. Tendrá que adaptarlo para sus diseños de tabla html según el resultado de su base de datos.

 calcTotalave(); }); // calculate total average function calcTotalave() { var totalAve = 0; $( ".average" ).each(function() { var thisAve = parseFloat($(this).text()) || 0; // always return a number totalAve += thisAve; }); var Aver = totalAve / $('.average').length; console.log(totalAve); $("#total-ave").text(Aver); } 

en lugar de clasificar cada celda como .average , podría usar el selector para apuntar a todas las celdas td de una fila dada:

 $('input').change(function() { calTotalAverages(); // the magic and collect the total average }); function calTotalAverages(){ var SumAve = 0, nums = 0; // to collect total averages and the number of rows $('tr').each(function(i) { if (i > 0) { // ignore the first row var $this = $(this); SumAve += calcRowAve($this); // add up the returned averages and run the function nums ++; // count the rows } }); // cycle through each row var sum = (SumAve / nums); $('#total-ave').text(sum.toFixed(2)); // display the total average return sum; // return the total average } // calculate total average function calcRowAve(targetRow) { var totalAve = 0, targetCells = targetRow.children(), targLength = targetCells.length - 2; // total number of values in a row targetCells.each(function(i) { if (i > 0 && i <= targLength) { var thisAve = parseFloat($('input',this).val()) || parseFloat($(this).text()) || 0; // always return a number totalAve += thisAve; } // check to ignore the first cell and the last }); var Aver = totalAve / targLength; // get the average targetCells.last().text(Aver); // update the last cell of the row return Aver; // return the average for this row } 
 #total-ave { position: fixed; right: 2em; top: 8em; } input{ width: 5em; } 
  
item 1 value 1 value 2 value 3 value 4 average
1 90 88 87 80
2 80 85 86 84
3