41 lines
1.0 KiB
TypeScript
41 lines
1.0 KiB
TypeScript
const reverseItems = new Set([1, 3, 5, 6]);
|
|
const perseveranceItems = [2, 4, 7, 8];
|
|
const consistencyItems = [1, 3, 5, 6];
|
|
|
|
function scoreItem(answers: string[], item: number) {
|
|
const raw = Number(answers[item - 1] || 1);
|
|
return reverseItems.has(item) ? 6 - raw : raw;
|
|
}
|
|
|
|
function average(values: number[]) {
|
|
return values.reduce((sum, value) => sum + value, 0) / values.length;
|
|
}
|
|
|
|
export function calculateGritResults(answers: string[]) {
|
|
const itemScores = Array.from({ length: 8 }, (_, index) =>
|
|
scoreItem(answers, index + 1),
|
|
);
|
|
const totalAverage = average(itemScores);
|
|
const perseveranceAverage = average(
|
|
perseveranceItems.map((item) => scoreItem(answers, item)),
|
|
);
|
|
const consistencyAverage = average(
|
|
consistencyItems.map((item) => scoreItem(answers, item)),
|
|
);
|
|
|
|
let level: 'low' | 'moderate' | 'high' = 'moderate';
|
|
if (totalAverage < 3) {
|
|
level = 'low';
|
|
} else if (totalAverage >= 4) {
|
|
level = 'high';
|
|
}
|
|
|
|
return {
|
|
itemScores,
|
|
totalAverage,
|
|
perseveranceAverage,
|
|
consistencyAverage,
|
|
level,
|
|
};
|
|
}
|