简体   繁体   中英

How can I fix this simple mean calculator so it works and how can I make it so it takes as many numbers as I want?

I am making a mean calculator with HTML, JS, and Jquery. I wasn't sure how to retrieve the number of numbers that are entered so I came up with var numberOfNumbers = $('input').attr('class').length but I don't think it works. What is a better way to collect the number of numbers used to find the mean? Is there anything else wrong with my code? Also how can I make it so that I can enter as many numbers as I want and find the average of them? Thanks.

<!DOCTYPE html>
<html>
  <head>
    <title>Find Average</title>
    <script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
    <script src="meancalculator.js"></script>
  </head>
  <body>
    <p>Number 1</p>
    <input type="text" id="number1" class="numbers">
    <p>Number 2</p>
    <input type="text" id="number2" class="numbers">
    <p>Number 3</p>
    <input type="text" id="number3" class="numbers">
    <button>Calculate</button>
    <p>The mean is <span></span></p>
  </body>
</html>

$(function () {
  $('button').click(calculate)
})

var number1 = $('#number1').val()
var number2 = $('#number2').val()
var number3 = $('#number3').val()
var numberOfNumbers = $('input').attr('class').length

function calculate() {
  var result = (number1 + number2 + number3) / numberOfNumbers
}

$('span').html(result)

Best case;

You can use "numbers" class for find it.

    var numberOfNumbers = $.find('.numbers').length;

Worst case;

If you think you will use "number" class for something else, you can add an data attribute for numbers such as;

<input type="text" id="number1" class="numbers" data-bla-bla="numbers">

and find specified data attribute;

var numberOfNumbers = 0;
$.each($.find('.numbers'),function(a,b) { if ($(b).attr('data-bla-bla') != undefined && $(b).attr('data-bla-bla') == 'numbers') { numberOfNumbers++; } });

You can use $('input').each() for get inputs in the page and $(e).val() to get value of each element withing the each()

DEMO

 $(function() { $('button').click(calculate) }) function calculate() { let result = 0 $('input').each((i, e) => { let val = parseInt($(e).val()); if (!isNaN(val)) { result += val } }) $('span').html(result / $('input').length); } 
 <script src="https://code.jquery.com/jquery-3.2.1.min.js"></script> <p>Number 1</p> <input type="text" id="number1" class="numbers"> <p>Number 2</p> <input type="text" id="number2" class="numbers"> <p>Number 3</p> <input type="text" id="number3" class="numbers"> <button>Calculate</button> <p>The mean is <span></span></p> 

Replace your following code :

var numberOfNumbers = $('input').attr('class').length

to:

var numberOfNumbers = $('.numbers').length

A couple of things:

  • You are taking input field values outside of calculate function. By that time numbers may not have entered. Same goes for displaying results. Move these lines inside calculate function.
  • Use $('input.numbers').length to get count of input elements having class numbers
  • Read the numeric values with + in prefix as +$('#number1').val()

Here is your modified code:

 <!DOCTYPE html> <html> <head> <title>Find Average</title> <script src="https://code.jquery.com/jquery-3.2.1.min.js"></script> <script src="meancalculator.js"></script> </head> <body> <p>Number 1</p> <input type="text" id="number1" class="numbers"> <p>Number 2</p> <input type="text" id="number2" class="numbers"> <p>Number 3</p> <input type="text" id="number3" class="numbers"> <button>Calculate</button> <p>The mean is <span></span></p> </body> </html> <script> $(function () { $('button').click(calculate) }) function calculate() { var number1 = +$('#number1').val() var number2 = +$('#number2').val() var number3 = +$('#number3').val() var numberOfNumbers = $('input.numbers').length var result = (number1 + number2 + number3) / numberOfNumbers $('span').html(result) } </script> 

Another way to approach the problem is just to have one input into which the user can add a list of numbers to take the mean of:

 $(function () { $('button').click(calculate) }) var number1 = $('#number1').val() var number2 = $('#number2').val() var number3 = $('#number3').val() var numberOfNumbers = $('input').attr('class').length function calculate() { let numbers = $('#numbers').val().split(/[ ,]+/); let sum = numbers.reduce((c, v) => c + parseInt(v), 0); let result = sum / numbers.length; $('span').html(result); } 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <p>Enter a list of numbers separated by space or comma:</p> <input type="text" id="numbers" class="numbers"> <button>Calculate</button> <p>The mean is <span></span></p> 

I think what you want is something dynamic like this :)

 var count = 1, total = 0, mean = 0; $(document).on('click', '#addNewField', function() { var containerDiv = document.createElement('div'); containerDiv.className += "inputWrapper"; var inputField = document.createElement('input'); inputField.setAttribute('type', 'number'); inputField.className += 'number'; containerDiv.append(inputField); var deleteSpan = document.createElement('span'); deleteSpan.className += 'delete'; inputField.after(deleteSpan); $('#fields').append(containerDiv); inputField.focus(); count++; $('#count').text(count); }); $(document).on('keyup', '.number', function() { calculate(); }); function calculate() { total = 0; mean = 0; $('.number').each(function() { total += parseFloat($(this).val()); mean = total / count; }); $('#total').text(total); $('#mean').text(mean); } $(document).on('click', '.delete', function() { $(this).parent().remove(); count--; $('#count').text(count); calculate(); }); 
 .inputWrapper { position: relative; } .number { width: 200px; height: 30px; line-height: 30px; font-size: 24px; padding-left: 30px; margin: 5px 0; display: block; } table td { text-align: center; } input.number+*:after { content: "×"; font-size: 32px; top: 0; left: 5px; position: absolute; } #addNewField { height: 30px; width: 235px; margin: 10px 0 20px; } 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.0.0/jquery.min.js"></script> <div id="fields"> <div class="inputWrapper"> <input type="number" class="number"><span class='delete'></span> </div> </div> <button id="addNewField">+ Add New Field</button> <table border="1px" cellPadding="10px"> <tr> <th>Count</th> <th>Total</th> <th>Mean</th> </tr> <tr> <td id="count">1</td> <td id="total">0</td> <td id="mean">0</td> </tr> </table> 

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM