我有问题添加一个数组的所有元素以及平均它们。我将如何做到这一点,并实现它与我目前的代码?元素的定义如下所示。

<script type="text/javascript">
//<![CDATA[

var i;
var elmt = new Array();

elmt[0] = "0";
elmt[1] = "1";
elmt[2] = "2";
elmt[3] = "3";
elmt[4] = "4";
elmt[5] = "7";
elmt[6] = "8";
elmt[7] = "9";
elmt[8] = "10";
elmt[9] = "11";

// Problem here
for (i = 9; i < 10; i++){
  document.write("The sum of all the elements is: " + /* Problem here */ + " The average of all the elements is: " + /* Problem here */ + "<br/>");
}   

//]]>
</script>

当前回答

如果有人需要的话-这是递归平均。

在原始问题的上下文中,如果您允许用户插入额外的值,并且希望“更新”现有的平均值,而不需要再次访问每个元素,则可能需要使用递归平均值。

/**
 * Computes the recursive average of an indefinite set
 * @param {Iterable<number>} set iterable sequence to average
 * @param {number} initAvg initial average value
 * @param {number} initCount initial average count
 */
function average(set, initAvg, initCount) {
  if (!set || !set[Symbol.iterator])
    throw Error("must pass an iterable sequence");

  let avg = initAvg || 0;
  let avgCnt = initCount || 0;
  for (let x of set) {
    avgCnt += 1;
    avg = avg * ((avgCnt - 1) / avgCnt) + x / avgCnt;
  }
  return avg; // or {avg: avg, count: avgCnt};
}

average([2, 4, 6]);    //returns 4
average([4, 6], 2, 1); //returns 4
average([6], 3, 2);    //returns 4
average({
  *[Symbol.iterator]() {
    yield 2; yield 4; yield 6;
  }
});                    //returns 4

怎样去:

这是通过维持当前的平均值和元素计数来工作的。当要包含一个新值时,将count增加1,将现有平均值按(count-1) / count缩放,并将newValue / count添加到平均值中。

好处:

您没有对所有元素求和,这可能会导致大量的元素无法存储在64位浮点数中。 如果有其他值可用,您可以“更新”现有平均值。 您可以在不知道序列长度的情况下执行滚动平均。

缺点:

导致更多的分裂 不是无限的——仅限于数量。MAX_SAFE_INTEGER项,除非使用BigNumber

其他回答

这里是一个快速添加到“数学”对象在javascript中添加一个“平均”命令!!

Math.average = function(input) {
  this.output = 0;
  for (this.i = 0; this.i < input.length; this.i++) {
    this.output+=Number(input[this.i]);
  }
  return this.output/input.length;
}

然后我有这个加法“数学”对象得到和!

Math.sum = function(input) {
  this.output = 0;
  for (this.i = 0; this.i < input.length; this.i++) {
    this.output+=Number(input[this.i]);
  }
  return this.output;
}

那么你要做的就是

alert(Math.sum([5,5,5])); //alerts “15”
alert(Math.average([10,0,5])); //alerts “5”

我把占位符数组只是传递在你的变量(输入如果他们是数字可以是一个字符串,因为它解析到一个数字!)

在这种情况下,我推荐D3。它是最易读的(并提供了2种不同的平均值)

let d3 = require('d3');
let array = [1,2,3,4];
let sum = d3.sum(array); //10
let mean = d3.mean(array); //2.5
let median = d3.median(array); 

这是我的一个简单的求平均值的新手方法。希望这能帮助到一些人。

function numAvg(num){
    var total = 0;
    for(var i = 0;i < num.length; i++) { 
        total+=num[i];
    }
    return total/num.length;
}

我发现Mansilla的答案工作得很好,以确保我正在做浮点数的总和,而不是使用parseFloat()字符串的拼接:

let sum = ourarray.reduce((a, b) => parseFloat(a) + parseFloat(b), 0);
let avg = (sum / ourarray.length) || 0;

console.log(sum); // print out sum
console.log(avg); // print out avg

如果有人需要的话-这是递归平均。

在原始问题的上下文中,如果您允许用户插入额外的值,并且希望“更新”现有的平均值,而不需要再次访问每个元素,则可能需要使用递归平均值。

/**
 * Computes the recursive average of an indefinite set
 * @param {Iterable<number>} set iterable sequence to average
 * @param {number} initAvg initial average value
 * @param {number} initCount initial average count
 */
function average(set, initAvg, initCount) {
  if (!set || !set[Symbol.iterator])
    throw Error("must pass an iterable sequence");

  let avg = initAvg || 0;
  let avgCnt = initCount || 0;
  for (let x of set) {
    avgCnt += 1;
    avg = avg * ((avgCnt - 1) / avgCnt) + x / avgCnt;
  }
  return avg; // or {avg: avg, count: avgCnt};
}

average([2, 4, 6]);    //returns 4
average([4, 6], 2, 1); //returns 4
average([6], 3, 2);    //returns 4
average({
  *[Symbol.iterator]() {
    yield 2; yield 4; yield 6;
  }
});                    //returns 4

怎样去:

这是通过维持当前的平均值和元素计数来工作的。当要包含一个新值时,将count增加1,将现有平均值按(count-1) / count缩放,并将newValue / count添加到平均值中。

好处:

您没有对所有元素求和,这可能会导致大量的元素无法存储在64位浮点数中。 如果有其他值可用,您可以“更新”现有平均值。 您可以在不知道序列长度的情况下执行滚动平均。

缺点:

导致更多的分裂 不是无限的——仅限于数量。MAX_SAFE_INTEGER项,除非使用BigNumber