У меня есть таблица, которая вычисляет общее количество всех строк в нижнем колонтитуле. Мой вопрос: могу ли я опустить определенные строки на основе критериев.
Например, у меня есть сезонная статистика для бейсболиста, а в нижнем колонтитуле указано общее количество его карьеры.
Этот конкретный игрок играл за две разные команды в сезоне 2018 года. На это указывает TOTAL
в поле лиги LEAGUE
, в которое я добавил его общую статистику для каждой команды в этом сезоне.
Итак, взглянув на таблицу, вы должны заметить:
У него было 1 HITS
в сезоне 2017 года для STL
У него было 15 HITS
за сезон 2018 (5 за LAD
и 10 за BAL
)
Учитывая это, вы должны увидеть, что общее количество его карьеры в нижнем колонтитуле было подсчитано неправильно. У него должно быть 16 карьер, а не 31.
Поэтому, чтобы исправить это, я хотел бы исключить все строки, в которых есть TOTAL
в столбце LEAGUE
, из подсчета в итоговом колонтитуле. Как бы я это сделал? Любая помощь здесь будет принята с благодарностью. Спасибо.
YEAR Name AGE TEAM LEAGUE HITS
2017 John Smith 25 STL NL 1
2018 John Smith 26 TOTAL 15
2018 John Smith 26 LAD NL 5
2018 John Smith 26 BAL AL 10
Career Total 31
Вот мой код
<div align = "center">
<table id = 'battingtbl' class = "display compact nowrap">
<thead>
<tr>
<th>YEAR</th>
<th>NAME</th>
<th>AGE</th>
<th>TEAM</th>
<th>LEAGUE</th>
<th>HITS</th>
</tr>
</thead>
<tbody>
{% for stat in playerdata.bbhittingstatsmstr_set.all %}
<tr>
<td>{{ stat.year }}</td>
<td>{{ stat.name }}</td>
<td>{{ stat.age }}</td>
<td>{{ stat.team }}</td>
<td>{{ stat.league }}</td>
<td>{{ stat.hits }}</td>
</tr>
{% endfor %}
</tbody>
<tfoot>
<tr>
<th></th>
<th></th>
<th></th>
<th></th>
<th></th>
<th></th>
</tr>
</tfoot>
</table>
<script>
$(document).ready(function () {
$('#battingtbl').DataTable({
"searching": true,
"pageLength": 40,
"scrollX": true,
"paging": false,
"info": false,
drawCallback: () => {
const table = $('#battingtbl').DataTable();
const tableData = table.rows({
search: 'applied'
}).data().toArray();
const totals = tableData.reduce((total, rowData) => {
total[0] += parseFloat(rowData[5]); <!--HITS -->
return total;
}, [0,0,0,0,0,0]);
$(table.column(5).footer()).text(totals[0]); <!--HITS -->
}
})
});
</script>
Добавьте оператор if в вызов tableData.reduce
:
const totals = tableData.reduce((total, rowData) => {
if (rowData[4] !== 'TOTAL') {
total[0] += parseFloat(rowData[5]); <!--HITS -->
}
return total;
}, [0,0,0,0,0,0]);
$(table.column(5).footer()).text(totals[0]); <!--HITS -->
Также вы можете упростить начальное значение вызова reduce (3-й аргумент):
// totals is a Number not an Array
const totals = tableData.reduce((total, rowData) => {
if (rowData[4] !== 'TOTAL') {
total += parseFloat(rowData[5]); <!--HITS -->
}
return total;
}, 0);
$(table.column(5).footer()).text(totals);
Я делаю это правильно? snipper.io/s/-Lg9cLbCOT8HlrMY6sPT . Кажется, это не сработало для меня.
Я только что заметил ошибку в своем коде - извините за это. Я обновил код - попробуйте второй фрагмент еще раз.
Это сделало это! Бесконечно благодарен!
Все еще не работает правильно. Когда я выхожу из .toArray(), я получаю 0 в столбце HITS. Если я просто скопирую и вставлю то, что у вас есть, и оставлю это, я ничего не получу в нижнем колонтитуле (даже 0)