From b4234e61cc66e344a58f04018a5e2f29f1ee8e17 Mon Sep 17 00:00:00 2001 From: Kamil Date: Wed, 13 Nov 2024 14:12:01 +0100 Subject: [PATCH] task solution --- src/sortStudents.ts | 56 +++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 52 insertions(+), 4 deletions(-) diff --git a/src/sortStudents.ts b/src/sortStudents.ts index f511d15c..a2d36b6a 100644 --- a/src/sortStudents.ts +++ b/src/sortStudents.ts @@ -1,16 +1,64 @@ - export interface Student { // describe Student interface + name: string; + surname: string; + age: number; + married: boolean; + grades: number[]; } export enum SortType { // describe SortType enum + Name = 'name', + Surname = 'surname', + Age = 'age', + Married = 'married', + AverageGrade = 'grades', } // create SortOrder type -export type SortOrder; +export type SortOrder = 'asc' | 'desc'; + +export function sortStudents( + students: Student[], + sortBy: SortType, + order: SortOrder, +): Student[] { + const sortedStudents = [...students]; + + function getAverageGrades(student: Student): number { + return ( + student.grades.reduce((sum, grade) => sum + grade, 0) + / student.grades.length + ); + } + + switch (sortBy) { + case SortType.Surname: + case SortType.Name: + sortedStudents.sort((a, b) => { + return order === 'asc' + ? a[sortBy].localeCompare(b[sortBy]) + : b[sortBy].localeCompare(a[sortBy]); + }); + break; + + case SortType.AverageGrade: + sortedStudents.sort((a, b) => { + return order === 'asc' + ? getAverageGrades(a) - getAverageGrades(b) + : getAverageGrades(b) - getAverageGrades(a); + }); + break; + default: + sortedStudents.sort((a, b) => { + return order === 'asc' + ? +a[sortBy] - +b[sortBy] + : +b[sortBy] - +a[sortBy]; + }); + break; + } -export function sortStudents(students, sortBy, order) { - // write your function + return sortedStudents; }