From e355b2c89aba6d52b08d6a39c4b4acd11db35d02 Mon Sep 17 00:00:00 2001 From: Jakub Bajkowski Date: Thu, 12 Sep 2024 16:22:06 +0200 Subject: [PATCH 1/2] add task solution --- src/sortStudents.ts | 83 +++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 77 insertions(+), 6 deletions(-) diff --git a/src/sortStudents.ts b/src/sortStudents.ts index f511d15c..95a0063b 100644 --- a/src/sortStudents.ts +++ b/src/sortStudents.ts @@ -1,16 +1,87 @@ export interface Student { - // describe Student interface + name: string, + surname: string, + age: number, + married: boolean, + grades: Array, } export enum SortType { - // describe SortType enum + Name = 'Name', + Surname = 'Surname', + Age = 'Age', + Married = 'Married', + AverageGrade = 'AverageGrade', } -// create SortOrder type -export type SortOrder; +export type SortOrder = 'asc' | 'desc'; +function countAverage(grades: Array): number { + const countSum: number = grades.reduce((elem, val) => elem + val); + const countAve: number = countSum / grades.length; -export function sortStudents(students, sortBy, order) { - // write your function + return countAve; +} + +export function sortStudents(students: Array, + sortBy: SortType, order: SortOrder): Array { + let sortedStudents: Array = []; + + switch (sortBy) { + case SortType.Name: + sortedStudents = [...students].sort((a: Student, b: Student) => { + if (order === 'asc') { + return a.name.localeCompare(b.name); + } + + return b.name.localeCompare(a.name); + }); + break; + + case SortType.Surname: + sortedStudents = [...students].sort((a: Student, b: Student) => { + if (order === 'asc') { + return a.surname.localeCompare(b.surname); + } + + return b.surname.localeCompare(a.surname); + }); + break; + + case SortType.Age: + sortedStudents = [...students].sort((a: Student, b: Student) => { + if (order === 'asc') { + return a.age - b.age; + } + + return b.age - a.age; + }); + break; + + case SortType.Married: + sortedStudents = [...students].sort((a: Student, b: Student) => { + if (order === 'asc') { + return Number(a.married) - Number(b.married); + } + + return Number(b.married) - Number(a.married); + }); + break; + + case SortType.AverageGrade: + sortedStudents = [...students].sort((a: Student, b: Student) => { + if (order === 'asc') { + return countAverage(a.grades) - countAverage(b.grades); + } + + return countAverage(b.grades) - countAverage(a.grades); + }); + break; + + default: + break; + } + + return sortedStudents; } From 51cb5c44e60d6a31398faee7a21b9b81fa391dbf Mon Sep 17 00:00:00 2001 From: Jakub Bajkowski Date: Fri, 13 Sep 2024 14:23:46 +0200 Subject: [PATCH 2/2] add task solution --- src/sortStudents.ts | 75 ++++++++++++++++++--------------------------- 1 file changed, 29 insertions(+), 46 deletions(-) diff --git a/src/sortStudents.ts b/src/sortStudents.ts index 95a0063b..ba70b4f3 100644 --- a/src/sortStudents.ts +++ b/src/sortStudents.ts @@ -1,10 +1,11 @@ +/* eslint-disable implicit-arrow-linebreak */ export interface Student { - name: string, - surname: string, - age: number, - married: boolean, - grades: Array, + name: string; + surname: string; + age: number; + married: boolean; + grades: Array; } export enum SortType { @@ -18,65 +19,47 @@ export enum SortType { export type SortOrder = 'asc' | 'desc'; function countAverage(grades: Array): number { - const countSum: number = grades.reduce((elem, val) => elem + val); + const countSum: number = grades.reduce((elem, val) => elem + val, 0); const countAve: number = countSum / grades.length; return countAve; } -export function sortStudents(students: Array, - sortBy: SortType, order: SortOrder): Array { - let sortedStudents: Array = []; +export function sortStudents( + students: Array, + sortBy: SortType, + order: SortOrder, +): Array { + const sortedStudents = [...students]; - switch (sortBy) { - case SortType.Name: - sortedStudents = [...students].sort((a: Student, b: Student) => { - if (order === 'asc') { - return a.name.localeCompare(b.name); - } + const compareStrings = (a: string, b: string): number => + (order === 'asc' ? a.localeCompare(b) : b.localeCompare(a)); - return b.name.localeCompare(a.name); - }); - break; + const compareNumbers = (a: number, b: number): number => + (order === 'asc' ? a - b : b - a); + switch (sortBy) { + case SortType.Name: case SortType.Surname: - sortedStudents = [...students].sort((a: Student, b: Student) => { - if (order === 'asc') { - return a.surname.localeCompare(b.surname); - } - - return b.surname.localeCompare(a.surname); - }); + // Ensure that a[sortBy] is treated as a string + sortedStudents.sort((a: Student, b: Student) => + compareStrings(a[sortBy.toLowerCase() as keyof Student] as string, + b[sortBy.toLowerCase() as keyof Student] as string)); break; case SortType.Age: - sortedStudents = [...students].sort((a: Student, b: Student) => { - if (order === 'asc') { - return a.age - b.age; - } - - return b.age - a.age; - }); + sortedStudents.sort((a: Student, b: Student) => + compareNumbers(a.age, b.age)); break; case SortType.Married: - sortedStudents = [...students].sort((a: Student, b: Student) => { - if (order === 'asc') { - return Number(a.married) - Number(b.married); - } - - return Number(b.married) - Number(a.married); - }); + sortedStudents.sort((a: Student, b: Student) => + compareNumbers(Number(a.married), Number(b.married))); break; case SortType.AverageGrade: - sortedStudents = [...students].sort((a: Student, b: Student) => { - if (order === 'asc') { - return countAverage(a.grades) - countAverage(b.grades); - } - - return countAverage(b.grades) - countAverage(a.grades); - }); + sortedStudents.sort((a: Student, b: Student) => + compareNumbers(countAverage(a.grades), countAverage(b.grades))); break; default: