可以使用 Angular JavaScript Reduce 方法来查找移动平均线

问题描述 投票:0回答:2

想将我当前的 Angular Reduce 函数转换为基于每 ~2-3 个项目的周期计算移动平均线。这可以用标准的 Angular Reduce 函数来做吗?

这是我目前必须计算的基本平均值,但如果可能的话,我想将其转换为带有可设置周期的移动平均值,但不确定如何/是否可以使用标准的 Angular JS Reduce 函数。

    const data = [
    { val: 20 },
    { val: 15 },
    { val: 10 },
    { val: 12 },
    { val: 15 },
    { val: 09 },
    { val: 14 },
    { val: 17 },
    { val: 11 },
    { val: 15 }
    ]

    var avg= data.reduce((accum, curVal) => accum + curVal.val, 0) / data.length;
    console.log("avg= " + avg);
javascript angularjs moving-average
2个回答
0
投票

可以使用切片函数获取数组的一部分

let startIndex = 2;
let endIndex = 5;
let length = endIndex - startIndex;
var avg= data.slice(startIndex , endIndex ).reduce((accum, curVal) => accum + curVal.val, 0) / length;
console.log("avg= " + avg);

0
投票

如果我正确理解了这个问题,您需要一个数组,其中包含一组基于窗口的平均值,该窗口一次在数据中移动一个条目。这是一个使用 for 循环的示例,请参阅评论以了解其工作原理:

const data = [{ val: 20 }, { val: 15 }, { val: 10 }, { val: 12 }, { val: 15 }, { val: 9 }, { val: 14 }, { val: 17 }, { val: 11 }, { val: 15 }];

const get_moving_averages = (data, window_size = 3) => {
  const sums = [];
  
  for(let i = 0; i < data.length; i++) {
    if(i < window_size) {
      // add everything to the first slot for the first items up to window size
      sums[0] = (sums[0] ?? 0) + data[i];
    } else {
      // calculate value by taking the previous value, adding the new data
      // and taking off value that shouldn't be included in this sum from the previous sum
      sums[i + 1 - window_size] = sums[i - window_size] + data[i] - data[i - window_size];
    }
  }
  
  return sums.map((sum) => sum / window_size);
};

console.log(get_moving_averages(data.map(({val}) => val)));

相同的想法,但具有 reduce 功能:

const data = [{ val: 20 }, { val: 15 }, { val: 10 }, { val: 12 }, { val: 15 }, { val: 9 }, { val: 14 }, { val: 17 }, { val: 11 }, { val: 15 }];

const get_moving_averages = (data, window_size = 3) =>
  data.reduce((acc, val, i, all) => {
    const first_few = i < window_size;
    const sum_index = first_few ? 0 : i + 1 - window_size;
    
    acc[sum_index] = (acc[sum_index] ?? 0) + val;
    
    if(!first_few)
      acc[sum_index] += acc[sum_index - 1] - all[i - window_size];
    
    return acc;
  }, [])
  .map( (sum) => sum / window_size );

console.log(get_moving_averages(data.map(({val}) => val)));

© www.soinside.com 2019 - 2024. All rights reserved.