【问题标题】:JS: get 5 items each time from whole array and get averageJS:每次从整个数组中获取5个项目并取平均值
【发布时间】:2015-04-02 17:10:28
【问题描述】:

我有一个数组,例如 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 );
}

但我认为这不应该是有效的......有什么帮助吗?

【问题讨论】:

  • 你需要做 i+=5 而不是 i++ 然后

标签: javascript arrays loops average


【解决方案1】:

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

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

【讨论】:

  • 为什么不删除if 而改为使用for(var i=0; (i+5) &lt; arr.length; ...)
  • 您可以返回NaN 并使用isFinite 作为过滤器来修复精美版本中的0 部分
  • @C5H8NNaO4 - 好主意,我想不出任何可以使用零的东西,即使 filter(Number) 会失败,但 isFinite 有效。
【解决方案2】:

使用array.slice:

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

【讨论】:

    【解决方案3】:

    下面使用 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-10
      • 1970-01-01
      • 2021-01-30
      相关资源
      最近更新 更多