@@ -124,18 +124,19 @@ export class RubricQuestionStatisticsCalculation
124124 for ( const recipient of Object . keys ( this . perRecipientStatsMap ) ) {
125125 const perRecipientStats : PerRecipientStats = this . perRecipientStatsMap [ recipient ] ;
126126
127+ // Answers sum = number of answers in each column
127128 perRecipientStats . answersSum = this . calculateAnswersSum ( perRecipientStats . answers ) ;
128129 perRecipientStats . percentages = this . calculatePercentages ( perRecipientStats . answers ) ;
129- perRecipientStats . percentagesAverage =
130- this . calculatePercentagesAverage ( perRecipientStats . percentages ,
131- this . calculateNumResponses ( perRecipientStats . answersSum ) ) ;
130+ perRecipientStats . percentagesAverage = this . calculatePercentagesAverage ( perRecipientStats . answersSum ) ;
132131 perRecipientStats . subQuestionWeightAverage =
133132 this . calculateSubQuestionWeightAverage ( perRecipientStats . answers ) ;
134133 perRecipientStats . weightsAverage = this . calculateWeightsAverage ( this . weights ) ;
135- perRecipientStats . overallWeightedSum = this . calculateWeightedSum ( perRecipientStats . percentagesAverage ,
136- perRecipientStats . answersSum , perRecipientStats . weightsAverage ) ;
134+ // Overall weighted sum = sum of total chosen weight for all sub questions
135+ perRecipientStats . overallWeightedSum =
136+ + ( perRecipientStats . subQuestionTotalChosenWeight . reduce ( ( a , b ) => a + b ) ) . toFixed ( 2 ) ;
137+ // Overall weighted average = overall weighted sum / total number of responses
137138 perRecipientStats . overallWeightAverage = + ( perRecipientStats . overallWeightedSum
138- / ( this . calculateNumResponses ( perRecipientStats . answersSum ) ) ) . toFixed ( 2 ) ;
139+ / this . calculateNumResponses ( perRecipientStats . answersSum ) ) . toFixed ( 2 ) ;
139140 }
140141 }
141142
@@ -195,32 +196,19 @@ export class RubricQuestionStatisticsCalculation
195196 }
196197
197198 // Calculate percentage average for each column
198- private calculatePercentagesAverage ( percentages : number [ ] [ ] , numAnswers : number ) : number [ ] {
199- // Calculate sum of percentages for each column
200- const sums : number [ ] = this . calculateAnswersSum ( percentages ) ;
199+ private calculatePercentagesAverage ( answersSum : number [ ] ) : number [ ] {
200+ // Calculate total number of responses
201+ const numResponses = this . calculateNumResponses ( answersSum ) ;
201202 const averages : number [ ] = [ ] ;
202- // Divide each percentage by the number of answers
203- for ( let i : number = 0 ; i < sums . length ; i += 1 ) {
204- averages [ i ] = numAnswers === 0 ? 0 : + ( sums [ i ] / numAnswers ) . toFixed ( 2 ) ;
203+ // Divide each column sum by total number of responses, then convert to percentage
204+ for ( let i : number = 0 ; i < answersSum . length ; i += 1 ) {
205+ averages [ i ] = numResponses === 0 ? 0 : + ( answersSum [ i ] * 100 / numResponses ) . toFixed ( 2 ) ;
205206 }
206207 return averages ;
207208 }
208209
209- // Calculate weighted sum of responses
210- private calculateWeightedSum ( percentages : number [ ] , answers : number [ ] , weights : number [ ] ) : number {
211- let sum : number = 0 ;
212- for ( let i : number = 0 ; i < answers . length ; i += 1 ) {
213- sum += ( percentages [ i ] / 100 ) * answers [ i ] * weights [ i ] ;
214- }
215- return + sum . toFixed ( 2 ) ;
216- }
217-
218210 // Calculate total number of responses
219211 private calculateNumResponses ( answersSum : number [ ] ) : number {
220- let num : number = 0 ;
221- for ( let i = 0 ; i < answersSum . length ; i += 1 ) {
222- num += answersSum [ i ] ;
223- }
224- return num ;
212+ return answersSum . reduce ( ( a , b ) => a + b ) ;
225213 }
226214}
0 commit comments