使用Javascript从输入数组中查找平均值-计算不正确

使用Javascript从输入数组中查找平均值-计算不正确,javascript,arrays,moving-average,Javascript,Arrays,Moving Average,我试图计算用户选择的3个值(每个值的编号范围为1-10)的平均值,然后将结果传递给文本输入(以图形形式显示) 它应该在每次更改一个值时更新新的平均值,但平均值根本无法正常工作。我认为循环并不是每次运行时都重置值,而是每次运行时将总和相加,但不确定如何修复它 这是我的密码: var sliders = $("#health1,#health2,#health3"); var elmt = []; $(sliders).each(function () { elmt.push($(thi

我试图计算用户选择的3个值(每个值的编号范围为1-10)的平均值,然后将结果传递给文本输入(以图形形式显示)

它应该在每次更改一个值时更新新的平均值,但平均值根本无法正常工作。我认为循环并不是每次运行时都重置值,而是每次运行时将总和相加,但不确定如何修复它

这是我的密码:

var sliders = $("#health1,#health2,#health3");

var elmt = [];

$(sliders).each(function () {
    elmt.push($(this).attr('value'));

    $("#health1,#health2,#health3").change(function () {
        var sum = 0;
        averageRisk();
    });
});

function averageRisk() {
    var sum = 0;
    for (var i = 0; i < elmt.length; i++) {
        sum += parseInt(elmt[i], 10);
    }

    var avg = sum / elmt.length;
    document.getElementById('healthLevel').value = +avg;

    elmt.push($(sliders).attr('value'));
    $('#healthLevel').val(avg).trigger('change');

    console.log("Sum: " + sum);
    console.log("Average: " + avg);
}
var滑块=$(“#健康1,#健康2,#健康3”);
var-elmt=[];
$(滑块)。每个(函数(){
elmt.push($(this.attr('value'));
$(“#health1,#health2,#health3”)。更改(函数(){
var总和=0;
averageRisk();
});
});
函数averageRisk(){
var总和=0;
对于(变量i=0;i
以下是一个例子:


不确定,但似乎还有很多额外的工作要做。主要问题是您正在构建初始值的数组,而不是在每次值更改时获取它们。首先是
。每个
获得所有滑块值,并将它们添加到
elmt
,并在每次更改后继续将新值推送到,而不是每次仅获取当前值。是否要随时间累积所有值

小提琴:

$(“#健康1,#健康2,#健康3”)。关于('change',function(){
averageRisk();
});
函数averageRisk(){
var总和=0;
var elmt=$(“#health1,#health2,#health3”);
对于(变量i=0;i
如前所述,如果你想在总和为NaN时忽略更新,你可以这样做:

function averageRisk() {
    var sum = 0;
    var elmt = $("#health1,#health2,#health3");
    for (var i = 0; i < elmt.length; i++) {
        sum += parseInt(elmt[i].value, 10); //don't forget to add the base
    }

    if (isNaN(sum)) {
        return false;
    }

    var avg = sum / elmt.length;
    document.getElementById('healthLevel').value = +avg;

    $('#healthLevel').val(avg).trigger('change');
    console.log("Sum: " + sum);
    console.log("Average: " + avg);
}
函数averageRisk(){
var总和=0;
var elmt=$(“#health1,#health2,#health3”);
对于(变量i=0;i
不确定,但似乎还有很多额外的工作要做。主要问题是您正在构建初始值的数组,而不是在每次值更改时获取它们。首先是
。每个
获得所有滑块值,并将它们添加到
elmt
,并在每次更改后继续将新值推送到,而不是每次仅获取当前值。是否要随时间累积所有值

小提琴:

$(“#健康1,#健康2,#健康3”)。关于('change',function(){
averageRisk();
});
函数averageRisk(){
var总和=0;
var elmt=$(“#health1,#health2,#health3”);
对于(变量i=0;i
如前所述,如果你想在总和为NaN时忽略更新,你可以这样做:

function averageRisk() {
    var sum = 0;
    var elmt = $("#health1,#health2,#health3");
    for (var i = 0; i < elmt.length; i++) {
        sum += parseInt(elmt[i].value, 10); //don't forget to add the base
    }

    if (isNaN(sum)) {
        return false;
    }

    var avg = sum / elmt.length;
    document.getElementById('healthLevel').value = +avg;

    $('#healthLevel').val(avg).trigger('change');
    console.log("Sum: " + sum);
    console.log("Average: " + avg);
}
函数averageRisk(){
var总和=0;
var elmt=$(“#health1,#health2,#health3”);
对于(变量i=0;i
问题是在页面加载时填充
elmt
数组

当用户更改值时,您不会刷新
elmt
数组。因此,用于计算平均值的数组总是相同的,为空

每次修改输入值时,都必须恢复它们

function averageRisk() {
    var sum = 0;

    // Re make the loop for getting all inputs values
    $(sliders).each(function() {
        var value = parseInt($(this).val(), 10);
        sum += value;
    });

    var avg = sum/$(sliders).length;

    $('#healthLevel').val(avg);
}
工作示例:


PS:您可以使用css类
healthInput
来选择您的输入。如果稍后添加其他字段,则不必将新的输入id添加到jQuery选择器。

问题在于,在页面加载时填充
elmt
数组

当用户更改值时,您不会刷新
elmt
数组。因此,用于计算平均值的数组总是相同的,为空

每次修改输入值时,都必须恢复它们

function averageRisk() {
    var sum = 0;

    // Re make the loop for getting all inputs values
    $(sliders).each(function() {
        var value = parseInt($(this).val(), 10);
        sum += value;
    });

    var avg = sum/$(sliders).length;

    $('#healthLevel').val(avg);
}
工作示例:


PS:您可以使用css类
healthInput
来选择您的输入。如果稍后添加其他字段,则不必将新的输入id添加到jQuery选择器。

我完成了这项工作,请检查它


我做了这项工作,检查一下


是否应该有一个
elmt.pop()
elmt=[]某处?否则,您将一直添加到数组中。请尝试以下操作:是否应该有
elmt.pop()
elmt=[]某处?否则,您将一直添加到阵列中。试试这个:这是一个很好的解决方案。它可能希望忽略空元素(或者将它们当作0?),因为现在一个空元素将填充“NaN”非常正确!更新答案。是的,我同意这是一个很好的解决方案。它就像我想要的那样工作。在我的