You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按成绩均衡划分学生小组?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人的要求。同时,这种分配方式也无法保证优差学生搭配,容易出现分组失衡。

优化方案

采用「排序+动态分配」策略:

  1. 先将学生按成绩降序排序,便于后续优差搭配
  2. 每次将当前学生分配到人数未满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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 02:30:54