JS:每次从整个阵列中获得5个项目并获得平均值

时间:2015-04-02 17:10:29

标签: javascript arrays loops average

我有一个数组,例如 var arr = [2,7,3,8,9,4,9,2,8,7,9,7,3,2,4,5,7,8,2,7,6,1,8];

我想要(我觉得for循环最适合这个循环)整个数组上的for循环循环并在数组中彼此靠近得到5个项目并运行一个包含这5个项目的函数来计算它们的平均值。这当然要重复,直到没有5个部分可用。上面的数组有23个值。因此,当我应该在其上运行代码时,它可以在其上循环4次,因为再多一次它不能使它具有3/5值。

我想过:

for (var i = 0; i < arr.length; i++) {
    doThisFunction(i, i+1, i+2, i+3, i+4 );
}

但这不应该有效我相信......任何帮助?

3 个答案:

答案 0 :(得分:4)

你正在做某事,简单的方法是

var arr    = [2,7,3,8,9,4,9,2,8,7,9,7,3,2,4,5,7,8,2,7,6,1,8];
var result = [];

for (var i=0; (i+5)<arr.length; i=i+5) {
    var average = (arr[i] + arr[i+1] + arr[i+2] + arr[i+3] + arr[i+4]) / 5;
    result.push(average);
}

document.body.innerHTML = '<pre>' + JSON.stringify(result, null, 4) + '</pre>';

做同样事情的有点方式

var result = arr.map(function(x,i) {
    return i%5===0 ? arr.slice(i, i+5).reduce(function(a,b) {return a+b}) / 5 : NaN;
}).filter(isFinite);

答案 1 :(得分:0)

使用array.slice

for (var i = 0; i < Math.floor(arr.length/5); i++) {
    f(arr.slice(i*5, i*5+5))
}

答案 2 :(得分:0)

以下使用reduce和slice来汇总数组中的一系列值。

function averageRange(arr, start, end) {
  return (function(range) {
    return range.reduce(
      function(total, val) {
        return total + val;
      }, 0) / range.length;
  }([].slice.apply(arr, [].slice.call(arguments, 1))))
}

function averageEveryN(arr, n) {
  return arr.map(function(_, index, arr) {
    return index % n === 0 ? averageRange(arr, index, index + count) : NaN;
  }).filter(isFinite).slice(0, Math.floor(arr.length / n));
}

function println(text) {
  document.getElementsByTagName('body')[0].innerHTML += text + '<br />';
}


var arr = [2, 7, 3, 8, 9, 4, 9, 2, 8, 7, 9, 7, 3, 2, 4, 5, 7, 8, 2, 7, 6, 1, 8];
var count = 5;

averageEveryN(arr, count).map(function(value, index) {
  println((index + 1) + '.) ' + value.toFixed(4));
});

输出

1.) 5.8000
2.) 6.0000
3.) 5.0000
4.) 5.8000