如何计算数组中元素的总和和平均值?

284

我遇到了将数组所有元素相加并计算它们的平均值的问题。我该怎么做,并在当前代码中实现它?如下所示,这些元素应该被定义。

<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>

62
var elmt = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] 这样会更好。 - James M
35个回答

1
将你的 for 循环计数器设为 0... 现在你获取的是第 9 个元素,这就完成了。其他的答案都是基本的数学知识。使用一个变量来存储你的总和(需要将字符串转换为整数),并除以数组的长度。

1
除非我漏掉了什么,到目前为止,每个解决方案都使用列表的长度在求和后计算平均值。然而,这种方法存在一个缺点,稍加改进的简单算法可以解决这个问题并避免其缺点。问题在于你假设通过对所有数字求和不会发生溢出。如果有许多非常大的数字,将它们全部加起来可能会超过可以适应数据类型的最大大小。更好的方法是在进行计算时直接计算平均值,而不是在最后求和后再除以长度。
function getAvg(values) {
    return values.reduce((m, x, i) => m + (x - m) / (i + 1), 0)
}

致敬Knuth的《计算机程序设计艺术》第2卷。

1

在阅读其他选项后,我将尝试为未来的观众制作一个更简单的版本,详细说明现有代码而不是创建更优雅的代码。首先,您将数字声明为字符串。除了.parseInt之外,我们还可以做以下操作:

const numberConverter = elmt.map(Number);

所以map的作用是“返回原始数组的副本”。但我将其值转换为数字。然后我们可以使用reduce方法(它也可以更简单,但我编写易于阅读的版本,并且还有两种平均方法)。reduce方法的作用是,它具有累加器,如果您向其中添加值,则会变得越来越大,因为它在数组中迭代并将(在这种情况下)currentValue添加到其中。

var i;
const 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';

console.log(elmt);

const numberConverter = elmt.map(Number);

const sum = numberConverter.reduce((accumulator, currentValue) => {
  return accumulator + currentValue;
}, 0);

const average = numberConverter.reduce(
  (accumulator, currentvalue, index, numArray) => {
    return accumulator + currentvalue / numArray.length;
  },
  0
);

const average2 =
  numberConverter.reduce(
    (accumulator, currentValue) => accumulator + currentValue,
    0
  ) / numberConverter.length;

for (i = 9; i < 10; i++) {
  console.log(
    `The sum of all the elements is: ${sum}. <br> The average of all the elements is: ${average2}`
  );}

1
如果您需要平均值并且可以跳过计算总和的要求,您可以使用一次reduce调用计算平均值:
// Assumes an array with only values that can be parsed to a Float
var reducer = function(cumulativeAverage, currentValue, currentIndex) {
  // 1. multiply average by currentIndex to find cumulative sum of previous elements
  // 2. add currentValue to get cumulative sum, including current element
  // 3. divide by total number of elements, including current element (zero-based index + 1)
  return (cumulativeAverage * currentIndex + parseFloat(currentValue))/(currentIndex + 1)
}
console.log([1, 2, 3, 4, 5, 6, 7, 8, 9, 10].reduce(reducer, 0)); // => 5.5
console.log([].reduce(reducer, 0)); // => 0
console.log([0].reduce(reducer, 0)); // => 0
console.log([].reduce(reducer, 0)); // => 0
console.log([,,,].reduce(reducer, 0)); // => 0
console.log([].reduce(reducer, 0)); // => 0

0

对于这个问题似乎有无数的解决方案,但我发现这个方法简洁而优雅。

const numbers = [1,2,3,4];
const count = numbers.length;
const reducer = (adder, value) => (adder + value);
const average = numbers.map(x => x/count).reduce(reducer);
console.log(average); // 2.5

更简洁地说:
const numbers = [1,2,3,4];
const average = numbers.map(x => x/numbers.length).reduce((adder, value) => (adder + value));
console.log(average); // 2.5

根据您的浏览器,您可能需要执行显式函数调用,因为箭头函数不受支持:

const r = function (adder, value) {
        return adder + value;
};
const m = function (x) {
        return x/count;
};
const average = numbers.map(m).reduce(r);
console.log(average); // 2.5

或者:

const average1 = numbers
    .map(function (x) {
        return x/count;
     })
    .reduce(function (adder, value) {
        return adder + value;
});
console.log(average1);

你正在 map 函数中进行 N 次除法操作。最好先将所有数字缩减为一个总值,然后再进行一次除法操作。 - Eugenio

0

我认为我们可以这样做

var k=elmt.reduce(function(a,b){return parseFloat(a+parseFloat(b));})
var avg=k/elmt.length; 
console.log(avg);

我使用了两次parseFloat,因为:

1)当你加上(a)9+b(“1”)这个数字时,结果将是“91”,但我们想要的是加法。所以我使用了parseFloat。

2)当(a)9+parseFloat(“1”)相加时,虽然结果将是“10”,但它将是字符串,而我们不想要这样,所以我再次使用了parseFloat。

希望我表达清楚了。欢迎提出建议。


0

这是我作为新手简单查找平均值的方法。希望能对某些人有所帮助。

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

0

只是为了好玩:

var elmt = [0, 1, 2,3, 4, 7, 8, 9, 10, 11], l = elmt.length, i = -1, sum = 0;
for (; ++i < l; sum += elmt[i])
    ;
document.body.appendChild(document.createTextNode('The sum of all the elements is: ' + sum + ' The average of all the elements is: ' + (sum / l)));

0

这是你的一行代码:

var average = arr.reduce((sum,item,index,arr)=>index !== arr.length-1?sum+item:sum+item/arr.length,0)

0

我认为这可能是使用for循环和函数计算平均值的直接解决方案。

var elmts = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];

function average(arr) {
    var total = 0;
    for (var i = 0; i < arr.length; i++) {
        total += arr[i];
    }
        console.log(Math.round(total/arr.length));
}

average(elmts);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接