遍历数组求连续5个元素平均值遇问题,寻求技术帮助
解决连续5个元素滑动平均值的问题
我来帮你梳理下代码里的核心问题,再给出修正后的方案:
你的代码里的几个关键问题
- 内层循环逻辑完全偏离了“取连续5个元素”的目标,
for (let j = array[i]; (j = array[i + 5]); i++)既没有正确遍历连续元素,还会修改外层循环的i,导致整个循环逻辑混乱。 - 用
+=操作数组其实是把数组转成字符串拼接,而非往数组里添加元素,应该用数组的push()方法。 - 外层循环的终止条件错误,应该是
i <= array.length - 5,否则当i过大时,i+4会超出数组下标范围,无法取到完整的5个元素。 - 计算平均值的函数没必要在循环里重复定义,既冗余又影响性能。
修正后的代码(带注释)
function slidingWindowAverage(array, windowSize = 5) { const averages = []; // 外层循环:遍历到能取到完整windowSize个元素的最后一个位置 for (let i = 0; i <= array.length - windowSize; i++) { // 直接截取从i开始的连续windowSize个元素 const currentWindow = array.slice(i, i + windowSize); // 计算当前窗口的总和 const windowSum = currentWindow.reduce((accumulator, current) => accumulator + current, 0); // 计算平均值并加入结果数组 averages.push(windowSum / windowSize); } console.log(averages); return averages; } const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9]; slidingWindowAverage(arr); // 输出: [3, 4, 5, 6, 7]
代码说明
- 我把函数名改成了
slidingWindowAverage,更贴合“滑动窗口平均值”的语义,还加了可选参数windowSize,方便以后调整窗口大小(比如改成3个元素)。 - 用
array.slice()直接截取连续元素,比手动循环添加更简洁易读。 - 外层循环的终止条件
i <= array.length - windowSize确保每次都能取到完整的窗口元素,不会出现数组越界问题。
如果偏好手动遍历窗口元素,也可以用下面的写法:
function slidingWindowAverage(array, windowSize = 5) { const averages = []; for (let i = 0; i <= array.length - windowSize; i++) { let sum = 0; // 内层循环遍历当前窗口的所有元素 for (let j = 0; j < windowSize; j++) { sum += array[i + j]; } averages.push(sum / windowSize); } console.log(averages); return averages; }
内容的提问来源于stack exchange,提问作者Jakub Meller
相关产品推荐
相关产品推荐

