50 lines
1.0 KiB
JavaScript
50 lines
1.0 KiB
JavaScript
// NOTE: SHEET IS UNDER BERKELEY ACC
|
|
|
|
/**
|
|
* Calculate GPA given grades & units
|
|
* @param {*} grades Grades column
|
|
* @param {*} units Class units (weights) column
|
|
*/
|
|
function GRADEPOINTS(grades, units) {
|
|
|
|
if (grades.length != units.length) {
|
|
throw Error("Grades & Units columns must have the same length")
|
|
}
|
|
else if (grades[0].length != 1 || units[0].length != 1) {
|
|
throw Error("Grades & Units each must be single columns")
|
|
}
|
|
|
|
let gradeMap = {
|
|
"A+": 4.0,
|
|
"A": 4.0,
|
|
"A-": 3.7,
|
|
"B+": 3.3,
|
|
"B": 3,
|
|
"B-": 2.7,
|
|
"C+": 2.3,
|
|
"C": 2.0,
|
|
"C-": 1.7,
|
|
"D+": 1.3,
|
|
"D": 1,
|
|
"D-": 0.7,
|
|
"F": 0.0,
|
|
}
|
|
|
|
let gpSum = 0;
|
|
let denom = 0;
|
|
for (let i = 0; i < grades.length; i++) {
|
|
let grade = grades[i][0];
|
|
let unitCount = units[i][0]
|
|
if (Object.keys(gradeMap).includes(grade)) {
|
|
gpSum += gradeMap[grade] * unitCount;
|
|
denom += unitCount;
|
|
}
|
|
}
|
|
|
|
if (denom == 0) {
|
|
throw Error("No valid values found in grades col")
|
|
}
|
|
|
|
return gpSum / denom;
|
|
}
|