如何修改JavaScript代码实现按子数组平均值分组对应索引?
问题:按子数组平均值分组索引
需求说明
给定一个二维数组,需要完成以下操作:
- 计算每个子数组的平均值
- 将具有相同平均值的子数组对应的索引分组
- 输出不重复的分组数组,仅保留子数组在输入数组中的索引
示例输入
[ [3, 3, 4, 2], // index 0: average = 3 [4, 4], // index 1: average = 4 [4, 0, 3, 3], // index 2: average = 2.5 [2, 3], // index 3: average = 2.5 [3, 3, 3], // index 4: average = 3 ];
预期输出
[[0, 4], [1], [2, 3]]
原因说明
索引0和4的子数组平均值均为3,索引1的平均值4唯一,索引2和3的平均值均为2.5,因此按上述分组。
现有代码问题
我编写了如下JavaScript代码,能正确计算平均值,但无法将索引按对应平均值分组得到预期输出,请问如何修改?
function solution(a) { let b = []; let entier = {}; a.filter((elt, cle) => { let s = a[cle].reduce((prevalue, curvalue) => prevalue + curvalue, 0); b[cle] = s / a[cle].length; entier[cle] = s / a[cle].length; }); console.log(entier); let arrNew = Object.entries(entier); console.log(arrNew); } let a = [ [3, 3, 4, 2], [4, 4], [4, 0, 3, 3], [2, 3], [3, 3, 3], ]; solution(a); // 期望输出 [[0, 4], [1], [2, 3]]
解决方案
原代码的核心问题是:将索引作为键、平均值作为值存入对象,这无法实现按平均值分组的需求。正确的思路应该是用平均值作为键,对应的索引数组作为值来构建分组映射。
修改后的代码
function solution(a) { // 初始化分组对象,键为平均值,值为对应索引的数组 const groups = {}; a.forEach((subArr, index) => { // 计算子数组的总和 const sum = subArr.reduce((prev, curr) => prev + curr, 0); // 计算平均值 const average = sum / subArr.length; // 处理分组逻辑 if (!groups[average]) { // 如果当前平均值不存在,创建新数组存入索引 groups[average] = [index]; } else { // 如果已存在,将索引追加到对应数组 groups[average].push(index); } }); // 提取对象的所有值,得到最终分组数组 return Object.values(groups); } let a = [ [3, 3, 4, 2], [4, 4], [4, 0, 3, 3], [2, 3], [3, 3, 3], ]; console.log(solution(a)); // 输出 [[0, 4], [1], [2, 3]]
关键修改点说明
- 替换遍历方法:用
forEach替代filter,因为我们不需要过滤数组,只是需要遍历每个子数组并处理索引。 - 重构分组逻辑:
- 用
average作为groups对象的键,确保相同平均值的索引会被归到同一组。 - 检查键是否存在,不存在则初始化新数组,存在则追加索引。
- 用
- 生成结果:通过
Object.values(groups)直接提取所有分组数组,得到预期的二维数组结构。
内容的提问来源于stack exchange,提问作者Farouky
相关产品推荐
相关产品推荐

