如何按成绩均衡划分学生小组?JS分组代码优化求助
学生分组代码优化方案
问题描述
需要将9名成绩不同的学生划分为3个作业小组,要求每组固定3人且总分均衡,避免优差学生集中。现有JS代码仅计算了每组目标总分,但分组结果出现人数、总分严重失衡的问题,需优化代码逻辑。
现有代码
var totalScore = 0; for (var i = 0; i < students.length; i++) { totalScore = totalScore + students[i].score; } var maxScoreForGroup = totalScore / 3; console.log(maxScoreForGroup); for (var o = 0 ; o < students.length; o++) { if ((students[o].score + homeWork1[0].scoreTotal) < maxScoreForGroup) { homeWork1[0].students.push(students[o].name); homeWork1[0].scoreTotal = homeWork1[0].scoreTotal + students[o].score; } else if ((students[o].score + homeWork2[0].scoreTotal) < maxScoreForGroup) { homeWork2[0].students.push(students[o].name); homeWork2[0].scoreTotal = homeWork2[0].scoreTotal + students[o].score; } else { homeWork3[0].students.push(students[o].name); homeWork3[0].scoreTotal = homeWork3[0].scoreTotal + students[o].score; } }
学生数据
var students = [ { "name": "Charles", "score": 10 }, { "name": "Max", "score": 10 }, { "name": "Samuel", "score": 10 }, { "name": "Carl", "score": 7.5 }, { "name": "James", "score": 7.5 }, { "name": "Frank", "score": 7.5 }, { "name": "George", "score": 5 }, { "name": "Timothy", "score": 5 }, { "name": "Paul", "score": 5 } ];
当前错误输出
[{"scoreTotal":20,"students":["Charles","Max"]}] [{"scoreTotal":17.5,"students":["Samuel","Carl"]}] [{"scoreTotal":30,"students":["James","Frank","George","Timothy","Paul"]}]
问题分析
原代码仅通过「当前组总分+学生分数是否低于目标分」判断分配逻辑,未限制每组人数上限,且按顺序遍历学生时,前两组会优先吸纳学生直到接近目标分,导致最后一组被迫接收剩余所有学生,完全不符合每组3人的要求。同时,这种分配方式也无法保证优差学生搭配,容易出现分组失衡。
优化方案
采用「排序+动态分配」策略:
- 先将学生按成绩降序排序,便于后续优差搭配
- 每次将当前学生分配到人数未满3人且当前总分最低的小组,同时控制每组人数不超过3人
优化后代码
// 计算总分数与每组目标分数 const totalScore = students.reduce((sum, student) => sum + student.score, 0); const targetScore = totalScore / 3; // 初始化3个小组,包含学生列表、当前总分、人数计数 const groups = [ { students: [], scoreTotal: 0, count: 0 }, { students: [], scoreTotal: 0, count: 0 }, { students: [], scoreTotal: 0, count: 0 } ]; // 将学生按成绩降序排序,方便优差搭配 const sortedStudents = [...students].sort((a, b) => b.score - a.score); // 分配学生到小组 sortedStudents.forEach(student => { // 筛选出人数未满3人的小组 const availableGroups = groups.filter(group => group.count < 3); // 找到当前总分最低的可用小组 const targetGroup = availableGroups.reduce((minGroup, currentGroup) => { return currentGroup.scoreTotal < minGroup.scoreTotal ? currentGroup : minGroup; }); // 添加学生到目标小组 targetGroup.students.push(student.name); targetGroup.scoreTotal += student.score; targetGroup.count += 1; }); // 输出结果 console.log(JSON.stringify(groups));
代码说明
- 使用
reduce计算总分数,替代传统for循环,更简洁高效 - 对学生按成绩降序排序,确保高分学生优先分配,搭配后续低分学生,避免优差集中
- 每次分配时,优先选择人数未满且总分最低的小组,既保证每组人数固定为3,又能最大化平衡各组总分
- 最终每组会自动形成「1个高分+1个中等分+1个低分」的搭配,完全符合需求
内容的提问来源于stack exchange,提问作者Matheus Ribeiro
相关产品推荐
相关产品推荐

