Home > front end >  match objects then calculate grade for student grade
match objects then calculate grade for student grade

Time:11-17

I'm stuck with a problem.

So i'm making this student grading system. The way it works is that the system should be able to match answer key with a student's answer. The answer keys are stored like this:

 const answerkeys = {math01: a, math02: b, math03 : d, ...}

There is also a grading system where math01 is worth 5 points, and math 02 worth 10 points, etc. Out of confusion, i saved the data in another set of data collection as something like this:

const scoring = {math01: 5, math02: 10, math03: 5, ...}

And then the students' answers are stored like this:

const answers = {0: {math01: a, math02: c, ... }
           1: {math01: b, math02: a, ... }
           2: {math01: a, math02: c, ... }
           ...
           }

At first, logically i thought i can iterate answers, then the individual result will be matched with answerkeys and the returned (matches) will then be multiplied with answerkeyandscore.

So i tried doing it this way:

const studentAnswers = answers.map((elem) => {return elem});

studentAnswer.filter(answer => answerkeys.includes(answer));

But it is giving me

"result.js:82 Uncaught TypeError: Cannot read properties of undefined (reading 'filter')"

How to compare between "answerkeys" and "answers" and then calculate the scores using "scoring"?

CodePudding user response:

There is no native map to the Object object, but i suggest this will works:

let allStudentsScores = {}

for (var idx in answers) {
    let studentAnswer = answers[idx]
    let studentScore = 0
    for(var key in studentAnswer) {
        if (studentAnswer[key]==answerkeys[key]) {
            studentScore  = scoring[key]
        }

    }
    allStudentsScores[idx] = studentScore
}

the allStudentsScores variable contains each of student's score. Where the idx <0, 1, 2, ...> represents each student.

Hope answers your question.

  • Related