Last active
August 13, 2019 21:03
-
-
Save holdenhinkle/737fb05bf0edf87b863600effecb540a to your computer and use it in GitHub Desktop.
LS Practice Problem: Class Records Summary
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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