Подтвердить что ты не робот

Вычислить сумму каждого td, имеющего аналогичный класс

Моя таблица html td выглядит так:

<td class="20">1</td>
<td class="20">2</td>
<td class="20">3</td>
<td class="20">4</td>
<td class="20">5</td>
<td class="20">3</td>
<td class="total"></td>
<td class="30">2</td>
<td class="30">5</td>
<td class="30">6</td>
<td class="total"></td>

Я пытаюсь подсчитать количество td's, доступное до класса total, и суммировать значения и поместить их в соответствующий общий класс td.

Итак, я хочу получить

<td class="20">1</td>
<td class="20">2</td>
<td class="20">3</td>
<td class="20">4</td>
<td class="20">5</td>
<td class="20">3</td>
<td class="total">Total : 18</td>
<td class="30">2</td>
<td class="30">5</td>
<td class="30">6</td>
<td class="total">Total : 13</td>

Это то, что я пробовал.

var sum = 0;
$('.total').each(function(){
var tdTxt = $(this).prev('td').text();
    sum += parseFloat(tdTxt);                       
});

Но это не работает. как достичь этого?

4b9b3361

Ответ 1

Try:

var temp = 0;
$('td').each(function(){

var tdTxt = $(this).text();
     if($(this).hasClass('total')) {
         $(this).text(temp);
         temp = 0;
    } else {
       temp+= parseFloat(tdTxt);    
    } 

});

https://jsfiddle.net/8f4b1tok/

Ответ 2

После просмотра вашего обновления я могу пойти с prevUntil:

$('.total').each(function(){//To calculate with
  var sum = 0;//initialize sum equal to 0
  var fields = $(this).prevUntil('.total');//find the required tds until the .total
  fields.each(function(){//loop each total fields
    sum += parseFloat($(this).text());//add each tds value to sum
  });
$(this).html('<b>The total is: ' + sum + '</b>');//push the value of sum to .total field
});

https://jsfiddle.net/dox114ff/

Ответ 3

$(document).ready(function() {

  $('.total').each(function() {
    var prevClass = $(this).prev().attr('class');
    var sum = 0;
    $('.' + prevClass).each(function() {
      sum += Number($(this).text());
    })

    $(this).text('Total :'+sum);
  })

});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<table>
  <tr>
    <td class="20">1</td>
    <td class="20">2</td>
    <td class="20">3</td>
    <td class="20">4</td>
    <td class="20">5</td>
    <td class="20">3</td>
    <td class="total">8</td>
    <td class="30">2</td>
    <td class="30">5</td>
    <td class="30">6</td>
    <td class="total"></td>
  </tr>
</table>

Ответ 4

Так как jQuery предоставил .prevUntil() API для перехода к предыдущему брату до тех пор, пока не встретит элемент, который остановится, используйте его так:

$('.total').each(function() {

  var sum = 0,
      elem = $(this).prevUntil('.total');

  elem.each(function() {
     sum += parseInt($(this).text())
  });

  $(this).text('Total :' + sum);

});

DEMO

Ответ 6

Вы можете использовать prevUntil для перехода назад к предыдущему siblings td до селектора, DOM и т.д. Подробнее можно узнать о prevUntil здесь.

Пожалуйста, найдите рабочую демонстрацию здесь.

HTML:

<table>
    <tbody>
        <tr>
            <td class="20">1</td>
            <td class="20">2</td>
            <td class="20">3</td>
            <td class="20">4</td>
            <td class="20">5</td>
            <td class="20">3</td>
            <td class="total"></td>
            <td class="30">2</td>
            <td class="30">5</td>
            <td class="30">6</td>
            <td class="total"></td>
        </tr>
    </tbody>
</table>

JS:

$(function () {
    $('.total').each(function () {
        var numbers = $(this).prevUntil('.total').text().split('');
        var total = 0;
        $.each(numbers, function (k, v) {
            total += parseInt(v);
        });
        $(this).text('[Total = ' + total + ']');
        console.log('total=', total);
    })
});

Ответ 7

Вы можете попробовать следующее:

$('.total').each(function() { 
    var sum = $(this).prevUntil('.total').map(function() { 
        return parseInt($(this).text()); 
    }).get().reduce((a, b) => a + b, 0);

    $(this).text('Total : ' + sum);
});