Advertisement
dimipan80

Exams - Users Module

Dec 23rd, 2014
210
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /* There are two types of data entries: Students and Trainers.
  2. Each entry has id, first name, last name, town and role (student or trainer).
  3. The trainers have set of courses and lectures per day.
  4. The students have set of grades, level and certificate (true / false).
  5. Your task is to sort the data according to the input conditions and print it to the console.
  6. If the students criteria is to sort them by name, you should sort them by first name and as second condition by
  7. last name. If the student`s criteria is to sort them by level, you should sort them by level and
  8. as second condition by id.
  9. The trainers should be sorted by the quantity of their courses and as second condition by lectures per day.
  10. The first line of the input will be the sorting condition (students^trainers) in the format
  11. [name/level]^[courses].
  12. The rest lines of the input will be data you should sort in JSON format.
  13. The output should be in the format:
  14. {students:  [{ first name,  last name, average grade,  certificate }, … ],
  15. trainers: [ { id, first name, last name, courses, lectures per day}, … ]}. */
  16.  
  17. "use strict";
  18.  
  19. function studentsAndTrainersInfoSorter(args) {
  20.     var criteriesBySort = args[0].split('^').filter(Boolean);
  21.     var moduleObj = {'students': [], 'trainers': []};
  22.  
  23.     for (var i = 1; i < args.length; i += 1) {
  24.         getDataFromRowAndPutIntoObject(moduleObj, JSON.parse(args[i]));
  25.     }
  26.  
  27.     sortingStudents(moduleObj.students, criteriesBySort[0]);
  28.     sortingTrainers(moduleObj.trainers);
  29.     console.log(JSON.stringify(moduleObj));
  30.  
  31.     function getDataFromRowAndPutIntoObject(object, inputObj) {
  32.         var currentObj = {
  33.             'id': inputObj['id'],
  34.             'firstname': inputObj['firstname'],
  35.             'lastname': inputObj['lastname']
  36.         };
  37.         if (inputObj['role'] == 'student') {
  38.             currentObj['averageGrade'] = calculateAverageGrade(inputObj['grades']);
  39.             currentObj['certificate'] = inputObj['certificate'];
  40.             currentObj['level'] = inputObj['level'];
  41.             object.students.push(currentObj);
  42.         } else {
  43.             currentObj['courses'] = inputObj['courses'];
  44.             currentObj['lecturesPerDay'] = inputObj['lecturesPerDay'];
  45.             object.trainers.push(currentObj);
  46.         }
  47.     }
  48.  
  49.     function calculateAverageGrade(gradesArr) {
  50.         if (gradesArr.length) {
  51.             var sum = 0;
  52.             gradesArr.forEach(function (num) {
  53.                 sum += parseFloat(num);
  54.             });
  55.  
  56.             return (sum / gradesArr.length).toFixed(2);
  57.         }
  58.     }
  59.  
  60.     function sortingStudents(studentsArr, criteriaBySort) {
  61.         if (studentsArr.length > 1) {
  62.             if (criteriaBySort == 'level') {
  63.                 studentsArr.sort(function (obj1, obj2) {
  64.                     return (obj1.level != obj2.level) ? (obj1.level - obj2.level) :
  65.                         (obj1.id - obj2.id);
  66.                 });
  67.             } else {
  68.                 studentsArr.sort(function (obj1, obj2) {
  69.                     return (obj1.firstname == obj2.firstname) ? (obj1.lastname.localeCompare(obj2.lastname)) :
  70.                         (obj1.firstname.localeCompare(obj2.firstname));
  71.                 });
  72.             }
  73.         }
  74.  
  75.         studentsArr.forEach(function (obj) {
  76.             delete obj.level;
  77.         });
  78.     }
  79.  
  80.     function sortingTrainers(trainersArr) {
  81.         if (trainersArr.length > 1) {
  82.             trainersArr.sort(function (obj1, obj2) {
  83.                 return (obj1.courses.length != obj2.courses.length) ? (obj1.courses.length - obj2.courses.length) :
  84.                     (obj1.lecturesPerDay - obj2.lecturesPerDay);
  85.             });
  86.         }
  87.     }
  88. }
  89.  
  90. studentsAndTrainersInfoSorter([
  91.     'level^courses',
  92.     '{"id":0,"firstname":"Angel","lastname":"Ivanov","town":"Plovdiv","role":"student",' +
  93.     '"grades":["5.89"],"level":2,"certificate":false}',
  94.     '{"id":1,"firstname":"Mitko","lastname":"Nakova","town":"Dimitrovgrad","role":"trainer",' +
  95.     '"courses":["PHP","Unity Basics"],"lecturesPerDay":6}',
  96.     '{"id":2,"firstname":"Bobi","lastname":"Georgiev","town":"Varna","role":"student",' +
  97.     '"grades":["5.59","3.50","4.54","5.05","3.45"],"level":4,"certificate":false}',
  98.     '{"id":3,"firstname":"Ivan","lastname":"Ivanova","town":"Vidin","role":"trainer",' +
  99.     '"courses":["JS","Java","JS OOP","Database","OOP","C#"],"lecturesPerDay":7}',
  100.     '{"id":4,"firstname":"Mitko","lastname":"Petrova","town":"Sofia","role":"trainer",' +
  101.     '"courses":["Database","JS Apps","Java"],"lecturesPerDay":2}'
  102. ]);
  103.  
  104. studentsAndTrainersInfoSorter([
  105.     'name^courses',
  106.     '{"id":0,"firstname":"Angel","lastname":"Ivanov","town":"Plovdiv","role":"student",' +
  107.     '"grades":["5.89"],"level":2,"certificate":false}',
  108.     '{"id":1,"firstname":"Mitko","lastname":"Nakova","town":"Dimitrovgrad","role":"trainer",' +
  109.     '"courses":["PHP","Unity Basics"],"lecturesPerDay":6}',
  110.     '{"id":2,"firstname":"Angel","lastname":"Georgiev","town":"Varna","role":"student",' +
  111.     '"grades":["5.59","3.50","4.54","5.05","3.45"],"level":4,"certificate":false}',
  112.     '{"id":3,"firstname":"Ivan","lastname":"Ivanova","town":"Vidin","role":"trainer",' +
  113.     '"courses":["JS","Java","JS OOP","Database","OOP","C#"],"lecturesPerDay":7}',
  114.     '{"id":4,"firstname":"Mitko","lastname":"Petrova","town":"Sofia","role":"trainer",' +
  115.     '"courses":["Database","JS Apps"],"lecturesPerDay":2}'
  116. ]);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement