Skip to content

Instantly share code, notes, and snippets.

@holdenhinkle
Last active August 13, 2019 21:03
Show Gist options
  • Save holdenhinkle/737fb05bf0edf87b863600effecb540a to your computer and use it in GitHub Desktop.
Save holdenhinkle/737fb05bf0edf87b863600effecb540a to your computer and use it in GitHub Desktop.
LS Practice Problem: Class Records Summary
var studentScores = {
student1: {
id: 123456789,
scores: {
exams: [90, 95, 100, 80],
exercises: [20, 15, 10, 19, 15],
},
},
student2: {
id: 123456799,
scores: {
exams: [50, 70, 90, 100],
exercises: [0, 15, 20, 15, 15],
},
},
student3: {
id: 123457789,
scores: {
exams: [88, 87, 88, 89],
exercises: [10, 20, 10, 19, 18],
},
},
student4: {
id: 112233445,
scores: {
exams: [100, 100, 100, 100],
exercises: [10, 15, 10, 10, 15],
},
},
student5: {
id: 112233446,
scores: {
exams: [50, 80, 60, 90],
exercises: [10, 0, 10, 10, 0],
},
},
};
function generateClassRecordSummary(scores) {
function processGradeData(scores, student) {
const NUMBER_OF_EXAMS = 4;
const EXAM_WEIGHT = 0.65;
const EXERCISE_WEIGHT = 0.35;
let examAverage = scores[student].scores.exams.reduce(sumNumbers) / NUMBER_OF_EXAMS;
let exerciseAverage = scores[student].scores.exercises.reduce(sumNumbers);
return Math.round(examAverage * EXAM_WEIGHT + exerciseAverage * EXERCISE_WEIGHT);
}
function processExamData(scores, student, examData) {
scores[student].scores.exams.forEach((exam, index) => {
if (examData[index + 1] === undefined) examData[index + 1] = [];
examData[index + 1].push(exam);
});
return examData;
}
const sumNumbers = (sum, number) => sum + number;
const formatGradeSummary = (grades) => {
return grades.map((grade) => {
return `${grade} (${letterGrade(grade)})`;
});
}
const letterGrade = (grade) => {
if (grade < 60) return 'F';
if (grade < 70) return 'D';
if (grade < 80) return 'C';
if (grade < 90) return 'B';
return 'A';
}
function formatExamSummary(exams) {
let summary = [];
Object.keys(exams).forEach((exam) => {
let scores = exams[exam];
let avg = scores.reduce(sumNumbers) / scores.length;
let min = Math.min(...scores);
let max = Math.max(...scores);
summary.push({ average: avg, minimum: min, maximum: max, });
});
return summary;
}
let gradeData = [];
let examData = {};
Object.keys(scores).forEach((student) => {
gradeData.push(processGradeData(scores, student))
examData = processExamData(scores, student, examData)
});
return { studentGrades: formatGradeSummary(gradeData),
exams: formatExamSummary(examData), };
}
console.log(generateClassRecordSummary(studentScores));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment