如何在Javascript中动态计算对象数组内所有学生的Q1、Q3与中位数
实现思路
- 先提取所有学生姓名列表:你的
boxplotInput每个元素结构完全一致,直接取第一条数据的key排除Day即可,不需要循环所有行重复获取keys - 新增外层循环遍历所有学生姓名,把你原有单学生的计算逻辑套入循环内,每个学生对应生成一套统计结果
- 用对象存储所有学生的统计结果,方便后续调用取值
完整实现代码
var boxplotInput = [{Day: "01-07-2021", "Thomas": 95, "Diana": 94, "Claura": 93, "Chandler": 93}, {Day: "02-07-2021", "Thomas": 95, "Diana": 94, "Claura": 94, "Chandler": 94}, // 省略中间数据 {Day: "31-07-2021", "Thomas": 92, "Diana": 94, "Claura": 93, "Chandler": 91}]; // 提取所有学生姓名(仅取第一条数据的key即可) const studentNames = Object.keys(boxplotInput[0]).slice(1); // 存储所有学生的统计结果 const allStudentStats = {}; // 外层遍历所有学生,批量计算 for (let i = 0; i < studentNames.length; i++) { const currentStudent = studentNames[i]; // 收集当前学生的所有成绩 const studentScores = []; for (let j = 0; j < boxplotInput.length; j++) { studentScores.push(boxplotInput[j][currentStudent]); } // 排序(沿用你原有逻辑) studentScores.sort((a, b) => a - b); const length = studentScores.length; const midIndex = middleIndex(studentScores, 0, length); const medianValue = studentScores[midIndex]; const Q1 = studentScores[middleIndex(studentScores, 0, midIndex)]; const Q3 = studentScores[middleIndex(studentScores, midIndex + 1, length)]; // 存入结果对象 allStudentStats[currentStudent] = { Q1, median: medianValue, Q3 }; // 打印当前学生的统计结果 console.log(`${currentStudent} 统计结果:Q1=${Q1}, 中位数=${medianValue}, Q3=${Q3}`); } // 沿用你原有求索引的函数,计算逻辑无需修改 function middleIndex(data, initial, length){ var n = length - initial + 1; n = parseInt((n + 1) / 2); return parseInt(n + initial); } // 后续可直接通过学生姓名取对应统计值,例如:console.log(allStudentStats.Diana.Q3)
内容的提问来源于stack exchange,提问作者Vadivel A
相关产品推荐
相关产品推荐

