如何在JavaScript中计算多维数组对应位置元素的平均值
问题描述
在JavaScript中,生成了x个均包含57个数字的数组,需要计算每个对应索引位置元素的平均值,最终得到一个由这些平均值组成的数组。计算规则如下:
- 结果数组[0] = (array1[0] + array2[0] + ... + arrayX[0]) / 数组总数
- 结果数组[1] = (array1[1] + array2[1] + ... + arrayX[1]) / 数组总数
- 以此类推
以下是生成的多维数组示例:
const multiArray = [ [4, 3, 3, 4, 3, 4, 4, 4, 4, 4, 4, 4, 5, 5, 4, 3, 5, 5, 4, 4, 4, 4, 3, 4, 3, 4, 3, 4, 4, 4, 4, 3, 4, 3, 5, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 3, 5, 3, 5], [1, 3, 1, 2, 1, 3, 2, 2, 3, 1, 2, 1, 3, 2, 3, 1, 4, 4, 4, 4, 4, 3, 1, 1, 4, 3, 3, 2, 2, 2, 4, 3, 3, 3, 3, 2, 3, 3, 3, 1, 2, 1, 1, 2, 2, 4, 1, 4, 1, 1, 3, 4, 3, 2, 1, 2, 4], [1, 3, 2, 4, 4, 4, 3, 4, 5, 4, 2, 4, 2, 3, 3, 4, 2, 1, 1, 2, 2, 1, 2, 3, 4, 1, 1, 1, 3, 3, 3, 3, 2, 2, 2, 4, 4, 1, 2, 3, 2, 2, 4, 3, 4, 2, 4, 4, 2, 2, 1, 2, 3, 1, 2, 1, 1], [2, 4, 4, 3, 2, 3, 1, 4, 3, 3, 1, 2, 1, 1, 3, 4, 4, 2, 3, 2, 2, 1, 2, 2, 4, 1, 2, 1, 1, 4, 2, 3, 3, 3, 1, 4, 1, 4, 1, 4, 4, 4, 1, 1, 3, 3, 3, 4, 1, 3, 2, 1, 4, 1, 1, 2, 4], [1, 1, 3, 1, 1, 2, 4, 4, 5, 1, 2, 1, 2, 2, 3, 4, 4, 2, 1, 3, 1, 2, 4, 3, 4, 4, 4, 4, 1, 3, 1, 2, 2, 4, 1, 4, 1, 3, 3, 4, 1, 3, 4, 2, 4, 1, 4, 3, 4, 1, 2, 4, 4, 1, 1, 4, 4] ];
解决方案
方法一:直观累加实现
逻辑清晰,适合新手理解,先初始化总和数组,再遍历每个子数组累加对应索引的值,最后计算平均值:
function calculateIndexAverages(multiArray) { // 处理空输入的边界情况 if (!multiArray.length) return []; const arrayCount = multiArray.length; // 创建和子数组长度一致的总和数组,初始值为0 const sumArray = new Array(multiArray[0].length).fill(0); // 遍历每个子数组,累加对应索引的数值 multiArray.forEach(subArray => { subArray.forEach((num, index) => { sumArray[index] += num; }); }); // 计算平均值,如需保留小数可添加toFixed(例如sum / arrayCount).toFixed(2)) return sumArray.map(sum => sum / arrayCount); } // 调用示例 const averages = calculateIndexAverages(multiArray); console.log(averages);
方法二:链式reduce写法
利用reduce直接构建总和数组,代码更紧凑:
const calculateIndexAverages = (multiArray) => { if (!multiArray.length) return []; const arrayCount = multiArray.length; // 用reduce累加每个索引的总和,再映射为平均值 return multiArray .reduce((sumArr, subArr) => sumArr.map((sum, idx) => sum + subArr[idx]), new Array(multiArray[0].length).fill(0)) .map(sum => sum / arrayCount); }; // 调用示例 const averages = calculateIndexAverages(multiArray); console.log(averages);
注意事项
- 两种方法都处理了空数组的边界情况,避免运行时错误
- 如果需要格式化输出的平均值(比如保留2位小数),可以在最后一步的
map中修改:
这里用.map(sum => Number((sum / arrayCount).toFixed(2)))Number将toFixed返回的字符串转回数字类型。
内容的提问来源于stack exchange,提问作者Wolk9
相关产品推荐
相关产品推荐

