I have a quicksort algoritm (Hoare Partition Scheme) for objects of my class and three comparators.
class Participant{
login;
fine;
solved;
}
/*This function should convert array of strings -
['alla 4 100','gena 6 1000','gosha 2 90','rita 2 90','timofey 4 80']
Into an array of Participant objects and return their names separated by 'n'
In this format:
gena
timofey
alla
gosha
rita
*/
function effectiveSort(membersInfo){
var sortedMembers = [];
for (let i = 0; i < membersInfo.length; ++i){
sortedMembers.push(new Participant);
sortedMembers[i].login = membersInfo[i].split(' ')[0];
sortedMembers[i].fine = Number(membersInfo[i].split(' ')[2]);
sortedMembers[i].solved = Number(membersInfo[i].split(' ')[1]);
}
sortedMembers = (quickSort(sortedMembers, 0, sortedMembers.length - 1, loginComparator));
sortedMembers = (quickSort(sortedMembers, 0, sortedMembers.length - 1, fineComparator));
sortedMembers = (quickSort(sortedMembers, 0, sortedMembers.length - 1, tasksAmountComparator));
return sortedMembers.map(a => a.login).join('n');
}
//Comparators for each class field. That's where the problem starts
function loginComparator(firstParticipant, secondParticipant){
return firstParticipant.login < secondParticipant.login;
}
function tasksAmountComparator(firstParticipant, secondParticipant){
return firstParticipant.solved >= secondParticipant.solved;
}
function fineComparator(firstParticipant, secondParticipant){
return firstParticipant.fine >= secondParticipant.fine;
}
//Hoare Partition Scheme
function partition(arr, start, end, compar) {
const pivotVal = arr[Math.floor((start + end) / 2)];
while (start <= end) {
while (compar(arr[start], pivotVal)) {
start++;
}
while (compar(pivotVal, arr[end])) {
end--;
}
if (start <= end) {
let temp = arr[start];
arr[start] = arr[end];
arr[end] = temp;
start++;
end--;
}
} return start;
}
function quickSort(arr, start = 0, end = arr.length - 1, compar) {
if (start < end) {
const index = partition(arr, start, end, compar);
quickSort(arr, start, index - 1, compar);
quickSort(arr, index, end, compar);
}
return arr;
}
//Test data
var real_mebmers = ['alla 4 100','gena 6 1000','gosha 2 90','rita 2 90','timofey 4 80'];
var zero_members = ['alla 0 0','gena 0 0','gosha 0 0','rita 0 0','timofey 0 0'];
console.log(effectiveSort(real_mebmers));
The problem starts in these comparators
return (firstParticipant.solved >= secondParticipant.solved);
and return firstParticipant.fine >= secondParticipant.fine;
JS will say that
return (firstParticipant.solved >= secondParticipant.solved);
^
TypeError: Cannot read property 'solved' of undefined
.
Same goes for fineComparator. If I change these return statements to
return (firstParticipant.solved > secondParticipant.solved);
and here return firstParticipant.fine > secondParticipant.fine;
Everthing seems fine. But why I can’t check two properties for equality? I checked these properties and they don’t have ‘undefined’ value, but JS somehow sees it…