function sortedPeopleArray(peopleArray) { arrayCopy = [...peopleArray]; function compare(a, b) { const nameA = a.name.toUpperCase(); const nameB = b.name.toUpperCase(); let comp = 0; if (nameA > nameB) { comp = 1; } else if (nameA < nameB) { comp = -1; } return comp; } arrayCopy.sort(compare); arrayCopy.sort(function(a,b) { return (a.satisfaction - b.satisfaction) * -1; }); arrayCopy.sort(function(a,b) { return (a.rating - b.rating) * -1; }); arrayCopy.sort(function(a,b) { return (a.age - b.age) * -1; }); return arrayCopy; }Intenté ordenar una matriz en función de todos sus valores de propiedad, pero mi función no devuelve el resultado deseado. ¿Hay una mejor manera de abordar esto?
¿Cómo ordenaría una matriz de objetos (código a continuación) en orden descendente de:
Estas propiedades se consideran exactamente en ese orden al ordenar
Si dos valores son iguales, se examina la siguiente propiedad de la lista para determinar qué persona se coloca primero. p.ej. si dos personas tienen la misma calificación, la persona con un número de satisfacción más alto se coloca primero
const array = [ { name: A age: 22 rating: 5 satisfaction: 2 }, { name: B age: 25 rating: 7 satisfaction: 4 }, { name: C age: 22 rating: 9 satisfaction: 8 }, ];La matriz de salida debe ser
result = [ { name: B, age: 25, rating: 7, satisfaction: 4, }, { name: C age: 22 rating: 9 satisfaction: 8 }, { name: A age: 22 rating: 5 satisfaction: 2 }, ];Debe aplicar las comparaciones una tras otra, unidas por el operador "o" ( || ). El operador or no procesará su segundo argumento si se determina que el primero es verdadero, es decir, si devolvió un valor diferente de 0.
La comparación de números se logra más fácilmente mediante una simple resta. Las cadenas se pueden comparar con String.prototype.localeCompare() :
const arr = [{name: "A",age: 22,rating: 5,satisfaction: 2},{name: "B",age: 25,rating: 7,satisfaction: 4},{name: "C",age: 22,rating: 9,satisfaction: 8}]; arr.sort((a,b)=> b.age-a.age || b.rating-a.rating || b.satisfaction-a.satisfaction || b.name.localeCompare(a.name)) console.log(arr);Haz la comparación todo en una sola función.
function compare(oA, oB) { if(oA.age == oB.age) { if(oA.rating == oB.rating) { if(oA.satisfaction == oB.satisfaction) { const nameA = oA.name.toUpperCase(); const nameB = oB.name.toUpperCase(); let comp = 0; if (nameA > nameB) { comp = 1; } else if (nameA < nameB) { comp = -1; } return comp; } else { return oB.satisfaction - oA.satisfaction; } } else { return oB.rating - oA.rating; } } else { return oB.age - oA.age; } } const array = [ { name: 'A', age: 22, rating: 5, satisfaction: 2 }, { name: 'B', age: 25, rating: 7, satisfaction: 4 }, { name: 'C', age: 22, rating: 9, satisfaction: 8 }, ]; let arrayCopy = [...array]; arrayCopy.sort(compare); console.log(arrayCopy)