Как исправить ошибку вычисления JavaScript из проверенных значений в формах - PullRequest
0 голосов
/ 05 апреля 2019

Форма, которую я настроил, имеет переключатели с разными значениями. Среднее значение рассчитывается на основе того, какое значение проверено и сколько значений проверено. Затем он округляется до ближайшего целого числа. Если выбрано значение 1, то это должно быть -1 в расчете. Это прекрасно работает для некоторых записей. Однако странная проблема заключается в том, что в некоторых записях среднее вычисленное значение может быть другим значением по сравнению с аналогичной записью в зависимости от порядка выбора значений, например

7,5,7,1,5,5,3 отпечатков в среднем 5

3,5,5,1,7,5,7, печатает в среднем 4

7 + 5 + 7-1 + 5 + 5 + 3 дает 31/7 = 4,42857, что должно быть 4, но при этом среднее значение выводится как 5

3 + 5 + 5-1 + 7 + 5 + 7 дает 31/7 = 4,42857, и это выдает правильное среднее значение, равное 4

Ниже приведен мой код для расчета в js. Я не уверен, как это произойдет. Буду очень признателен за помощь и надеюсь, что предоставил достаточно информации.

   for(i = 1; i <= activities_num; i++){

      var value_str = $(`input[name=${section}${i}]:checked`).val();

        if(value_str !== undefined) {
            var value = parseInt(value_str);
            if(value === 1) {
               value = -1;
            }
            if(value === 0 ) {
               counter = counter -1;
            }
            options_values_sum += value;
            counter ++;
        }
        console.log(i); 
    }
    var average = Math.round(options_values_sum / counter);

1 Ответ

0 голосов
/ 05 апреля 2019

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

Теперь у нас есть доступ к таким методам, как карта и уменьшение.

const getChk = (section) => document.querySelectorAll('section${section}     input[type="checkbox"]:checked');

const computeAverage = (section) => {
  let arr = Array.from(getChk());
  if (arr.length > 0) { 
    return Math.round(arr.map(chk => (parseInt(chk.value) === 1) ? -1 : parseInt(chk.value))
                         .reduce((a, v) => a + v) / arr.length);
  } 
  return 0;
}

document.addEventListener('click', (e) => {
  if (e.target.matches('input[type="checkbox"]')) {
    let avg = computeAverage('#average');
    document.querySelector('#result').innerText = avg;    
  }
});
<section id="average">
  <label>3</label><input type="checkbox" value="3">
  <label>7</label><input type="checkbox" value="7">
  <label>5</label><input type="checkbox" value="5">
  <label>5</label><input type="checkbox" value="5">
  <label>7</label><input type="checkbox" value="7">
  <label>1</label><input type="checkbox" value="1">
  <label>5</label><input type="checkbox" value="5">
  <label>7</label><input type="checkbox" value="7">
  <label>5</label><input type="checkbox" value="5">
  <label>5</label><input type="checkbox" value="5">
  <label>7</label><input type="checkbox" value="7">
  <label>3</label><input type="checkbox" value="3">
</section>

<div id="result"></div>

<p>7,5,7,1,5,5,3 prints an average of 4</p>

<p>3,5,5,1,7,5,7, prints an average of 4</p>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...