Как рассчитать столбец таблицы в JavaScript? - PullRequest
0 голосов
/ 18 сентября 2018

Используя JavaScript Я возвращаю список операторов магазина и динамически вставляю строку после последней строки (оператор), отображая итоговое значение для всех операторов в столбце итогов. Но теперь мне нужно отобразить промежуточную сумму для каждого оператора в столбце промежуточной суммы.

Вот то, что я показываю, ясно, что формула промежуточных итогов не здесь ...

enter image description here

Я знаю, что есть более угловатый способ сделать это. И я точно так и сделаю. Но сейчас я бы хотел, чтобы вы сфокусировались на пути, по которому я иду, относительно расчета этого промежуточного итога. И вот, на чем конкретно я бы хотел сосредоточиться:

var total = 0;
  document.querySelectorAll("td:nth-child(4)").forEach((cell, index) => {
    this.attendantNames.forEach(a=>{
      this.total += a.total;
    });
    cell.innerText = this.total;
  });

Но если вам нужно увидеть весь код контроллера, он прямо здесь:

export default class StoreTotalsController {
  constructor() {
    this.attendantNames = [];
    this.stores = [];
    this.emptyResult = true;
    this.totals = 0;
    this.total = 0;
    this.cellValue = "";
    this.runningTotalCells;
    //this.previousTotal = 0;
  }

  getAttendants() {
    showLoader('Searching');
    const baseUrl = '/src/areas/store-totals/services/tender-total-data.json';
    const getStores = new Request(baseUrl, {
      method: 'GET'
      });
    fetch(getStores).then(function(response){
      return response.json();
    }).then(resp => {
    if (!(resp[0] && resp[0].error)) {
      this.attendantNames = resp.stores[0].attendants;
      this.attendantNames.forEach(a=>{
        this.totals += a.total;
        console.log("Attendant :" , a.attendantName, "Had a total of :" , a.total, "With running total " , this.totals);
      });

      //Row at bottom displaying total of totals
      var table = document.querySelector('.table');
      var td1 = document.createElement('td');
      var td2 = document.createElement('td');
      var td3 = document.createElement('td');
      var tr = document.createElement("tr");
      tr.setAttribute("class", "last-row");
      var td1Data = document.createTextNode('  ');
      var td2Data = document.createTextNode('Total');
      var td3Data = document.createTextNode('$' + this.totals.toFixed(2));
      td1.appendChild(td1Data);
      td2.appendChild(td2Data);
      td3.appendChild(td3Data);
      tr.appendChild(td1);
      tr.appendChild(td2);
      tr.appendChild(td3);
      table.appendChild(tr);

      this.emptyResult = false;
      this.errorMessage = null;

    } else {
      this.errorMessage = resp[0].error.name;
    }
    digest();

  var total = 0;
  document.querySelectorAll("td:nth-child(4)").forEach((cell, index) => {
    this.attendantNames.forEach(a=>{
      this.total += a.total;
    });
    cell.innerText = this.total;
  });
    showLoader(false);
    });
  }

  searchIfReady() {
    if (this.search && this.date && this.date.isValid()) {
      this.getSearch();
    }
  }

  updateDate(date) {
    this.date = moment(date).startOf('day');
    this.searchIfReady();
  }
}
StoreTotalsController.$inject = ['$stateParams'];

Ответы [ 2 ]

0 голосов
/ 18 сентября 2018
let total = 0;

document.addEventListener("DOMContentLoaded", function(event) { 
  document.querySelectorAll("td:nth-child(2)").forEach((cell, index) => {
    const cellInnerHTML = cell.innerHTML
    const numericTotal = cellInnerHTML.substring(1, cellInnerHTML.length);

    total += parseInt(numericTotal) * 1000;

    cell.parentElement.querySelectorAll("td")[2].innerHTML = total;
  });
});

Codepen:

https://codepen.io/anon/pen/vzQyGy

  1. Вам необходимо позаботиться об удалении знака $.
  2. после parseInt, из-за формата ваших чисел у вас останутся (согласно вашему примеру) 2, 8 и 5 вместо 2000, 8000, 5000. Я наивно обращаюсь с этим умножением на 1000.Лучшее решение должно быть найдено, это всего лишь эскиз.
  3. Вам нужно отформатировать числа обратно к тому, что вы хотите.

Решение есть, я оставляю детали для вас:)

В случае вашего кода это должно выглядеть так:

this.attendantNames.forEach((attendant, index) => {
    const table = document.querySelector('.table');
    const attendantRow = table.querySelectorAll('tr')[index];
    const runningTotalCell = attendantRow.querySelectorAll('td')[2];

    //am assuming that this.totals is 0 at the beginning of this loop, right?
    this.totals += parseInt(attendant.total); //am not sure of format attendant.total have in your data, not sure if you need parsing here and if  it will work

    runningTotalCell.innerHTML = `$${this.totals.toFixed(2)}`; 
})

Это должен работать, но не в состоянии запустить код, посмотреть, действительно ли он работает или выдает ошибки, отладить его и т. д. Я не могу дать вам 100%.В случае какой-либо ошибки, пожалуйста, попробуйте решить ее самостоятельно :) Если вы застряли, вернитесь и спросите, что не так и где, я постараюсь помочь снова:)

Общие комментарии

  • ваш метод называется getAttendants, и он делает WAAAAY больше, чем это (получение обслуживающего персонала).Он выбирает данные обслуживающего персонала, создает части таблицы и заполняет эту таблицу данными.Не должно.Метод должен выполнять только одно (принцип единой ответственности) и иметь правильное имя.
  • Вы должны разделить обязанности между несколькими функциями и передавать данные между ними, позволяя каждой функции обрабатывать только одну задачу
** 1033 Ex.- функция A - извлекает данные обслуживающего персонала - функция B - создает таблицу - функция C - заполняет эту таблицу данными обслуживающего персонала

Внутри этих функций вы можете разбить свой код на более мелкие функции.Там, где вы размещаете комментарии, вы можете использовать функции, которые будут комментировать код внутри и просто по имени, они объяснят разработчику, что они делают.Ex.

Три строки ниже используются в каждом цикле, только для получения доступа к этому runnintTotalCell.

const table = document.querySelector('.table');
const attendantRow = table.querySelectorAll('tr')[index];
const runningTotalCell = attendantRow.querySelectorAll('td')[2];

Вы можете извлечь их и обернуть с помощью отдельной функции:

getRunningTotalCellForRow(rowIndex) { 
    const table = document.querySelector('.table');
    const attendantRow = table.querySelectorAll('tr')[index];
    return attendantRow.querySelectorAll('td')[2];
}

И использовать в цикле forEach.

И т. Д.

Обычно дляЧтобы узнать, как правильно кодировать, вы можете взять некоторые учебники, прочитать несколько книг и ознакомиться с правилами:)

Что касается книг - «Чистый код» Роберта С. Мартина - один из канонических.Что касается учебников и других онлайн-ресурсов.

Поиск в браузере выбранных вами текстов, таких как: - как писать чистый код - принцип единой ответственности - DRY KISS SOLID - основные принципы разработки программного обеспечения

Я думаю, что с сайтов, которые вы найдете, вы можетенайти гораздо больше и войти в это.

Удачи и веселья!

После того, как вы отредактировали свой код:

Я проверил ваш скриншот.Красная часть говорит мне, что в первой строке вы вставляете TOTAL FOR ALL (около 32k) во вторую ячейку, это значение, но удваивается, в третьем значении умножается на три.Это приводит к выводу, что вы, должно быть, запутываете некоторые дополнения в своем цикле.

Итак

var total = 0;
document.querySelectorAll("td:nth-child(4)").forEach((cell, index) => {
  this.attendantNames.forEach(a=>{
    this.total += a.total;
  });
  cell.innerText = this.total;
});

То, что вы делаете выше:

  1. вы определили var total = 0 (и никогда не используете его)

  2. для каждой 4-й ячейки

  3. принять всех участников и для каждого участника

  4. добавить значение total кthis.total

  5. и вставьте его во innerText

Вы видите сейчас?Для каждой ячейки вы вставляете итоговые итоги для всех операторов (плюс значение this.totals, которое у вас уже есть, поскольку вы никогда не обнуляете его).

Правильная версия ниже:

const runningTotalCells = document.querySelectorAll("td:nth-child(4)");
//no need for nested loops
this.attendantNames.forEach((attendant, index) => {
  this.total += a.total;
  runningTotalCells[index].innerText = this.total;
})

Работает ли сейчас?

0 голосов
/ 18 сентября 2018

Вы можете зациклить каждую вторую ячейку с помощью $("td:nth-child(2)").each, затем добавить значение этих ячеек к общей переменной и распечатать сумму до следующего значения с помощью $(this).next('td').text(total);

var total = 0;
$("td:nth-child(2)").each(function( index ) {
  total = parseInt($(this).text()) + parseInt(total);
  $(this).next('td').text(total);
});
table{
text-align: center;
}
td{
width: 100px;
background-color: orange;
}
th{
background-color: orange;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<table>
<th>name</th>
<th>Total</th>
<th>Running Total</th>
<tr>
<td>Eric</td>
<td>100</td>
<td></td>
</tr>

<tr>
<td>Lars</td>
<td>20</td>
<td></td>
</tr>

<tr>
<td>Patrick</td>
<td>200</td>
<td></td>
</tr>
</table>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...