Динамически рассчитывать процент в датируемой - PullRequest
0 голосов
/ 24 марта 2020

Как я могу динамически рассчитать процент в таблице данных при применении поиска? Результат должен выглядеть следующим образом:

<tr>
<td>10%</td><td>100</td>
<td>90%</td><td>900</td>
</tr>

Процент должен основываться на общем количестве отображаемых строк.

1 Ответ

1 голос
/ 24 марта 2020

В следующем примере показан базовый подход c.

Конечный результат выглядит следующим образом: обратите внимание, что при суммировании процентов вы можете получить небольшую ошибку округления:

enter image description here

Код выглядит следующим образом:

ОБНОВЛЕНИЕ - возникла проблема с моим исходным решением - оно использовалось jQuery для заполнения ячеек DataTable рассчитанными процентами. Это означало, что DataTables не отвечали на сортировку / фильтрацию для столбца процентов. Лучше использовать функции DataTables для заполнения ячеек данных.

<body>

<div style="margin: 20px;">

<table id="example" class="display dataTable cell-border" style="width:100%">
  <thead>
   <tr><th>ID</th><th>Amount</th><th>Percent</th></tr>
  </thead>
  <tbody>
    <tr><td>1</td><td>123.4</td><td class="percent"></td></tr>
    <tr><td>2</td><td>234.5</td><td class="percent"></td></tr>
    <tr><td>3</td><td>543.21</td><td class="percent"></td></tr>
    <tr><td>4</td><td>76</td><td class="percent"></td></tr>
    <tr><td>5</td><td>87</td><td class="percent"></td></tr>
  </tbody>
</table>

</div>

<script type="text/javascript">

  $(document).ready(function() {

    var table = $('#example').DataTable({

      // wait for table and data to finish being initialized:
      "initComplete": function( settings, json ) {
        populatePercentages();
      }

    });

    function populatePercentages() {
      var total = 0.0;

      // first calcuate the total:
      $('#example').DataTable().rows().every( function ( rowIdx, tableLoop, rowLoop ) {
        // assumes amounts are not null, all numeric, and are in column 2:
        total = total + Number(this.data()[1]); 
      });

      // then calculate the percentage for each row:
      $('#example').DataTable().rows().every( function ( rowIdx, tableLoop, rowLoop ) {
        var amount = this.data()[1];
        // calculate percent to 2 decimal places:
        var percentage = Math.round((amount / total) * 10000) / 100;
        var cells = $('#example').DataTable().cells(rowIdx, 2);       
        cells.every( function () {
          this.data(percentage);
        });

      });
    }

  });
</script>

</body>

Обращает на себя внимание:

1) Используется класс «процентов» для ячеек, в которых будут отображаться проценты. Это облегчает выбор.

2) Вы можете сделать что-то подобное (1) и для ячеек сумм. Я не здесь.

3) Код дважды просматривает данные таблицы: один раз для расчета общей суммы; и снова, чтобы вычислить проценты.

4) Вам потребуется скорректировать предположения о смещениях столбцов, чтобы они соответствовали дизайну вашей таблицы.

5) Для обработки требуется дополнительная проверка, которая действительно должна быть добавлена отсутствующие или нечисловые данные c, чтобы сделать код менее хрупким.

Обработка случая, когда применяется поиск:

Фильтрация:

Приведенное выше решение может быть улучшено для пересчета процентов при фильтрации данных.

1) Есть два места, где используется функция rows(). В обоих местах измените это на следующее: rows( { search: 'applied' } ). Это обеспечит учет только видимых строк при расчете процентов.

2) Добавьте новый раздел кода для обработки событий keyup для поля поиска (фильтра). В моем случае селектор для этого элемента управления вводом, как показано ниже, - но это нужно будет отредактировать для других таблиц данных с другими идентификаторами (идентификатор таблицы моего примера example):

<script type="text/javascript">

  $(document).ready(function() {

    var table = $('#example').DataTable({
      ...
    });

    function populatePercentages() {
      ...
    }

    // catch filter events and re-calculate percentages accordingly:
    $('div#example_filter.dataTables_filter > label > input').keyup(function (e) {
      populatePercentages();
    });

  });
</script>

С этими изменениями отфильтрованный список будет выглядеть так:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...