La matriz externa debe ordenarse en función de la combinación de clasificaciones de la matriz de "pruebas" internas de longitud variable de cada estudiante, de forma ascendente. Aquí hay una versión simplificada de los datos sin procesar.
[ { "studentId": "A", "tests": [ { "testId": 100, "rank": 2 }, { "testId": 101, "rank": 1 }, { "testId": 102, "rank": 1 } ] }, { "studentId": "G", "tests": [ { "testId": 103, "rank": 3 }, { "testId": 104, "rank": 6 }, { "testId": 105, "rank": 3 }, { "testId": 106, "rank": 4 }, { "testId": 107, "rank": 3 } ] } ]Para abreviar, aquí hay una ilustración comentada para capturar las reglas para clasificar y desempatar. Imagine que cada uno de los siguientes representa la secuencia preordenada de los rangos de prueba individuales de cada estudiante. (Tenga en cuenta que los ID de prueba no importan, excepto para preservarlos. No nos preocupa comparar pruebas individuales, solo la combinación general de rangos de cada estudiante):
StudentId : [ascending sequence of test ranks] A : [ 1, 1, 2] // A beats B due to 2nd element B : [ 1, 2, 2] // B beats C due to 1st element C : [ 2, 3] // Let C beat D due to shorter length! D : [ 2, 3, 3] // D beats E due to 1st element E : [ 3, 3, 3, 4, 5, 7] // E beats F and G due to 5th element F : [ 3, 3, 3, 4, 6] // F and G are tied. Let F beat G due to studentId! (alphanumeric ascending) G : [ 3, 3, 3, 4, 6]Ninguno de los datos sin procesar está ordenado. Salida finalizada para incluir una matriz externa ordenada, con la matriz de prueba de cada estudiante ordenada por rango. Por favor, hágamelo saber si algo no está claro, y gracias.
Entonces, básicamente, la matriz debe ordenarse según la sum de los rangos de prueba en orden ascendente, ¿sí?
function sumTestRanks(students) { for(let student of students) { sumStudentTestRanks(student); } } function sumStudentTestRanks(student) { let testsRankTotal = 0; const tests = student.tests; for(let test of tests) { testsRankTotal += test.rank; } student.testsRankTotal = testsRankTotal; } function studentsSorter(studentA, studentB) { if(studentA.testsRankTotal < studentB.testsRankTotal) { return -1; } if(studentA.testsRankTotal > studentB.testsRankTotal) { return 1; } return studentA.studentId.localeCompare(studentB.studentId); } const students = [...]; sumTestRanks(students) console.log(students.sort(studentsSorter));Actualizar:
En ese caso, va así:
function studentsSorter(studentA, studentB) { const studentATests = studentA.tests; const studentBTests = studentB.tests; const studentATestsLength = studentATests.length; const studentBTestsLength = studentBTests.length; let scanLength = studentATestsLength; if(scanLength > studentBTestsLength) { scanLength = studentBTestsLength; } for(let index = 0; index < scanLength; index++) { const studentATest = studentATests[index]; const studentBTest = studentBTests[index]; if(studentATest.rank === studentBTest.rank) { continue; } if(studentATest.rank < studentBTest.rank) { return -1; } else if(studentATest.rank > studentBTest.rank) { return 1; } } if(studentATestsLength === studentBTestsLength) { return studentA.studentId.localeCompare(studentB.studentId); } else if(studentATestsLength < studentBTestsLength) { return -1; } else { return 1; } }Hice referencia a esta respuesta para comprender cómo funciona el comparador en JavaScript.