JavaScript中多个数组对应索引值求平均的实现咨询
如何计算多个对象对应索引位置数字的平均值?
需求回顾
给定多个对象,每个对象包含一个numbers数组(数组元素是带number属性的对象),需要生成一个新数组,其中每个索引位置的值为所有对象对应索引位置数字的平均值。示例中索引0的值为(4+7)/2,索引1的值为(5+6)/2,同时需要支持任意数量的对象和更长的numbers数组。
解决方案
核心思路是先提取所有对象的纯数字数组,再通过reduce累加对应索引的总和,最后除以对象数量得到平均值。以下是完整代码:
// 定义你的对象(可添加任意数量的object3、object4...) const object1 = { "numbers": [{ "number": 4 }, { "number": 5 }] }; const object2 = { "numbers": [{ "number": 7 }, { "number": 6 }] }; // 把所有对象放到一个数组中,方便批量处理 const allObjects = [object1, object2]; // 第一步:将每个对象的numbers数组转换为纯数字数组 const numberArrays = allObjects.map(obj => obj.numbers.map(item => item.number)); // 第二步:用reduce累加每个索引位置的总和 const sumArray = numberArrays.reduce((acc, curr) => { return curr.map((num, index) => (acc[index] || 0) + num); }, []); // 第三步:计算每个索引的平均值 const averageArray = sumArray.map(sum => sum / allObjects.length); console.log(averageArray); // 输出: [5.5, 5.5]
逻辑解释
- 提取纯数字数组:通过两层
map,把每个对象中嵌套的{number: x}结构转换成直接的数字,得到类似[[4,5], [7,6]]的二维数组。 - 累加索引总和:
reduce的初始值是空数组,每次遍历当前数字数组时,对每个索引位置的值进行累加——如果acc(累加结果数组)当前索引还没有值(第一次遍历),就用0加上当前数字,确保不同长度的数组都能兼容。 - 计算平均值:将总和数组的每个元素除以对象的数量,得到最终的平均值数组。
扩展性说明
- 支持更多对象:只需把新对象添加到
allObjects数组中即可,比如加入object3后,代码会自动计算3个对象对应索引的平均值。 - 支持更长的numbers数组:不管
numbers数组有多少个元素,只要所有对象的numbers数组长度一致(如果长度不一致,可以额外处理,比如取最短数组的长度或补0),代码都能正确累加对应索引的值。
常见问题排查
如果你之前用reduce失败,大概率是没先处理嵌套的number属性,或者累加时没对应好索引位置。比如直接对原对象数组reduce,没有先提取纯数字,就会导致无法正确累加。
内容的提问来源于stack exchange,提问作者user23303634
相关产品推荐
相关产品推荐

