如何对给定学生分数数组过滤并按500的百分比分段创建新对象
按分数区间过滤学生数组并分组到对应对象
没问题,我来一步步帮你实现这个需求。首先得明确每个分数区间的具体数值,再用数组过滤方法把学生分到对应的对象里。
第一步:明确各区间的分数范围
以500为基准分,各区间的计算方式如下:
- 对象A:500的±10% → 分数范围是
500×0.9 = 450到500×1.1 = 550(包含边界值) - 对象B:500的±20% → 分数范围是
500×0.8 = 400到500×1.2 = 600 - 对象C:500的±30% → 分数范围是
500×0.7 = 350到500×1.3 = 650 - 对象D:500的±40% → 分数范围是
500×0.6 = 300到500×1.4 = 700
第二步:代码实现(JavaScript)
首先得修正你给出的数组语法(JS里数组元素要用方括号包裹,同时修正变量名拼写studends→students),然后用filter方法完成分组:
// 修正后的学生数组 const students = [ ["Marc", 404], ["Paul", 450], ["Steve", 490], ["Jar", 500], ["Niels", 520], ["Marco", 540], ["Sacha", 560], ["Mike", 500], ["Ted", 520], ["Ammar", 540], ["Rolph", 560], ["Brian", 590], ["Jeff", 600], ["John", 650], ["Mickael", 890] ]; // 定义基准分和各区间的上下限(用比例计算更灵活) const baseScore = 500; const scoreRanges = { A: { min: baseScore * 0.9, max: baseScore * 1.1 }, B: { min: baseScore * 0.8, max: baseScore * 1.2 }, C: { min: baseScore * 0.7, max: baseScore * 1.3 }, D: { min: baseScore * 0.6, max: baseScore * 1.4 } }; // 生成分组后的对象 const groupedStudents = { A: students.filter(([name, score]) => score >= scoreRanges.A.min && score <= scoreRanges.A.max), B: students.filter(([name, score]) => score >= scoreRanges.B.min && score <= scoreRanges.B.max), C: students.filter(([name, score]) => score >= scoreRanges.C.min && score <= scoreRanges.C.max), D: students.filter(([name, score]) => score >= scoreRanges.D.min && score <= scoreRanges.D.max) }; // 查看分组结果 console.log(groupedStudents);
关键说明
- 语法修正:你原数组里的
("Marc", 404)是错误的JS语法,改成["Marc", 404]才能正确表示每个学生的姓名和分数。 - 灵活的区间计算:用比例而非固定数值计算区间,后续如果要调整基准分或比例,只需修改
baseScore或比例值即可,不用逐个修改区间数值。 - 默认包含逻辑:当前代码中,符合多个区间的学生会同时出现在多个对象里(比如Jar的500分同时属于A、B、C、D)。如果需要互斥分组(一个学生只属于优先级最高的区间,比如A优先于B),可以调整逻辑:先过滤出A组,再从剩余学生中过滤B组,以此类推,示例如下:
// 互斥分组的实现 let remainingStudents = [...students]; const exclusiveGroups = {}; // 先取A组 exclusiveGroups.A = remainingStudents.filter(([_, score]) => score >= scoreRanges.A.min && score <= scoreRanges.A.max); // 从剩余学生中移除A组的学生 remainingStudents = remainingStudents.filter(student => !exclusiveGroups.A.includes(student)); // 再取B组 exclusiveGroups.B = remainingStudents.filter(([_, score]) => score >= scoreRanges.B.min && score <= scoreRanges.B.max); remainingStudents = remainingStudents.filter(student => !exclusiveGroups.B.includes(student)); // 同理处理C和D组 exclusiveGroups.C = remainingStudents.filter(([_, score]) => score >= scoreRanges.C.min && score <= scoreRanges.C.max); remainingStudents = remainingStudents.filter(student => !exclusiveGroups.C.includes(student)); exclusiveGroups.D = remainingStudents.filter(([_, score]) => score >= scoreRanges.D.min && score <= scoreRanges.D.max);
这样处理后,每个学生只会出现在一个分组里。
内容的提问来源于stack exchange,提问作者jaykaydev
相关产品推荐
相关产品推荐

