Reputation: 1273
I have a table
I want to calculate the substraction from the volume for each day towards the day before.
How can I do that with jquery?
//I tried to use `map` function but don't know how to handle this
const volumes = $('tr td.volume').map(function() {
return $(this).text();
}).get();
console.log(volumes)
// now i have all the volume values; bu how to abstract for each and inject val in `consumed` class?
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<table class="table">
<tr>
<td class="date">2021-08-15</td>
<td class="volume">660</td>
<td class="consumed">text should be 20 (680 - 660)</td>
</tr>
<tr>
<td class="date">2021-08-14</td>
<td class="volume">680</td>
<td class="consumed">text should be 30 (710 - 680)</td>
</tr>
<tr>
<td class="date">2021-08-13</td>
<td class="volume">710</td>
<td class="consumed">text should be 20 (730 - 710)</td>
</tr>
<tr>
<td class="date">2021-08-12</td>
<td class="volume">730</td>
<td class="consumed">text should be 50 (780 - 730)</td>
</tr>
<tr>
<td class="date">2021-08-11</td>
<td class="volume">780</td>
<td class="consumed"></td>
</tr>
</table>
Upvotes: 0
Views: 63
Reputation: 31992
Loop through each element with the volume
class, get the element with the volume
class in the next row, get the difference, and assign that to the innerHTML of the sibling with the consumed
class.
$('.volume').each(function() {
const next = $(this).parent().next().find('.volume')
$(this).siblings('.consumed').html(+next.html() - $(this).html())
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<table class="table">
<tr>
<td class="date">2021-08-15</td>
<td class="volume">660</td>
<td class="consumed"></td>
</tr>
<tr>
<td class="date">2021-08-14</td>
<td class="volume">680</td>
<td class="consumed"></td>
</tr>
<tr>
<td class="date">2021-08-13</td>
<td class="volume">710</td>
<td class="consumed"></td>
</tr>
<tr>
<td class="date">2021-08-12</td>
<td class="volume">730</td>
<td class="consumed"></td>
</tr>
<tr>
<td class="date">2021-08-11</td>
<td class="volume">780</td>
<td class="consumed"></td>
</tr>
</table>
Upvotes: 1
Reputation: 178160
Plain JS version
const trs = [...document.querySelectorAll(".table tbody tr")];
trs.forEach((row, i) => {
if (i < trs.length - 1) {
const vol1 = row.querySelector(".volume").textContent;
const vol2 = trs[i + 1].querySelector(".volume").textContent;
row.querySelector(".consumed").textContent = vol2 - vol1;
}
})
<table class="table">
<tbody>
<tr>
<td class="date">2021-08-15</td>
<td class="volume">660</td>
<td class="consumed">text should be 20 (680 - 660)</td>
</tr>
<tr>
<td class="date">2021-08-14</td>
<td class="volume">680</td>
<td class="consumed">text should be 30 (710 - 680)</td>
</tr>
<tr>
<td class="date">2021-08-13</td>
<td class="volume">710</td>
<td class="consumed">text should be 20 (730 - 710)</td>
</tr>
<tr>
<td class="date">2021-08-12</td>
<td class="volume">730</td>
<td class="consumed">text should be 50 (780 - 730)</td>
</tr>
<tr>
<td class="date">2021-08-11</td>
<td class="volume">780</td>
<td class="consumed"></td>
</tr>
</tbody>
</table>
Upvotes: 1
Reputation: 1057
To expand on Phaelax's solution to allow for your table structure changing but maintaining those classes (would add as a comment, but I don't have enough rep points for that yet):
// Get rows
var tr = $('tr');
// loop through rows except last
for(var i=0; i < tr.length - 1; i++){
// current row and next row under it
var row = tr[i];
var next_row = tr[i+1];
// Grab values from volume column
var v1 = parseInt($(row).children('td.volume').text());
var v2 = parseInt($(next_row).children('td.volume').text());
// Calc new value
var new_val = v2 - v1;
// Put new value in 3rd column
$(row).children('td.consumed').text(new_val);
}
You might even be able to refine it a bit more from here by putting a similar loop in a:
$('tr').each(function(row) {
});
Upvotes: 0
Reputation: 1999
I realized after writing this that each column had it's own class assigned, so this could probably be written a little neater as my solution relies on your exact table structure.
// Get rows
var $tr = $('tr');
// loop through rows except last
for (var i = 0; i < $tr.length - 1; i++) {
// current row and next row under it
var row = $tr.get(i);
var next_row = $tr.get(i + 1);
// Grab values from volumn column
var v1 = parseInt($(row).children('td')[1].innerHTML);
var v2 = parseInt($(next_row).children('td')[1].innerHTML);
// Calc new value
var new_val = v2 - v1;
// Put new value in 3rd column
$(row).children('td')[2].innerHTML = new_val;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<table class="table">
<tr>
<td class="date">2021-08-15</td>
<td class="volume">660</td>
<td class="consumed">text should be 20 (680 - 660)</td>
</tr>
<tr>
<td class="date">2021-08-14</td>
<td class="volume">680</td>
<td class="consumed">text should be 30 (710 - 680)</td>
</tr>
<tr>
<td class="date">2021-08-13</td>
<td class="volume">710</td>
<td class="consumed">text should be 20 (730 - 710)</td>
</tr>
<tr>
<td class="date">2021-08-12</td>
<td class="volume">730</td>
<td class="consumed">text should be 50 (780 - 730)</td>
</tr>
<tr>
<td class="date">2021-08-11</td>
<td class="volume">780</td>
<td class="consumed"></td>
</tr>
</table>
Upvotes: 0