Ответ 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);
}
});
Моя таблица 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);
});
Но это не работает. как достичь этого?
Try:
var temp = 0;
$('td').each(function(){
var tdTxt = $(this).text();
if($(this).hasClass('total')) {
$(this).text(temp);
temp = 0;
} else {
temp+= parseFloat(tdTxt);
}
});
После просмотра вашего обновления я могу пойти с 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
});
$(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>
Так как jQuery предоставил .prevUntil()
API для перехода к предыдущему брату до тех пор, пока не встретит элемент, который остановится, используйте его так:
$('.total').each(function() {
var sum = 0,
elem = $(this).prevUntil('.total');
elem.each(function() {
sum += parseInt($(this).text())
});
$(this).text('Total :' + sum);
});
Попробуйте функцию .prevAll(). Обратите внимание на документацию по следующим ссылкам:
Вы можете использовать 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);
})
});
Вы можете попробовать следующее:
$('.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);
});