Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

143
Vistas
¿Cómo puedo "ordenar múltiples" una matriz de objetos en Javascript por claves?

Estoy tratando de "mejorar" mi función de clasificación para aceptar múltiples criterios y así hacer una clasificación múltiple de mi matriz de objetos.

Lo siento si esta es una pregunta simple, o si cometí errores de "novato", pero soy un desarrollador de frontend que aprende los fundamentos de JS y estoy tratando de aprender cómo funcionan las funciones de clasificación.

Aquí está mi código:

 const arrayOfObjects = [ { name: 'John', age: 30, city: 'New York', details: { occupation: 'developer', } }, { name: 'Jane', age: 25, city: 'Paris', details : { occupation: 'designer', } } ]; // This is my main sorting function that I'd like to use for "multi sorting" an array of objects function sortByKey(criteria) { return (a, b) => { let comparison = 0; criteria.forEach(criterion => { const varA = (typeof resolvePath(criterion.key, a) === 'string') ? resolvePath(criterion.key, a).toUpperCase() : resolvePath(criterion.key, a); const varB = (typeof resolvePath(criterion.key, b) === 'string') ? resolvePath(criterion.key, b).toUpperCase() : resolvePath(criterion.key, b); if (varA > varB) { comparison = 1; } else if (varA < varB) { comparison = -1; } if(criterion.order === 'desc') { comparison = (comparison * -1) } }); return comparison; }; } // This function is used to resolve the path of a key in an object function resolvePath(path, obj) { return path.split('.').reduce(function(prev, curr) { return prev ? prev[curr] : null }, obj || self) }

El uso de esto es:

 // MAIN USAGE console.log( arrayOfObjects.sort(sortByKey([ { key: 'age' } ])) ) console.log( arrayOfObjects.sort(sortByKey([ { key: 'details.occupation', order: 'desc' } ])) )

Pero me gustaría usarlo algún tipo de:

 console.log( arrayOfObjects.sort(sortByKey([ { key: 'details.occupation' }, { key: 'age', order: 'desc' ])) )

Esto se debe a que quiero dar a los usuarios la posibilidad de clasificar mi matriz en algún tipo de orden, como "Primero la edad, segundo el nombre, etc...".

Gracias por cualquier ayuda útil, ¡que tengas un buen día!

about 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

Cree una función que devuelva el valor del comparador para cada criterio. Recorra la matriz y llame a la función de comparación HASTA que se encuentre un valor distinto de cero. find dejará de buscar cuando compareByKey devuelva 1 o -1 .

 const sortByKey = (criteria) => (a, b) => { let returnValue = 0; criteria.find(c => returnValue = compareByKey(c, a, b)); return returnValue; } function compareByKey({ key, order = 'asc' }, a, b) { const varA = resolvePath(key, a) const varB = resolvePath(key, b) let comparison = 0; if (varA > varB) { comparison = 1; } else if (varA < varB) { comparison = -1; } if (order === 'desc') { comparison *= -1 } return comparison }

Si la parte de find es confusa o fea:

Otra forma sería reduce el valor de comparación de cada propiedad. Pero esto no provoca un cortocircuito cuando se encuentra un valor distinto de cero.

 const sortByKey = criteria => (a, b) => criteria.reduce((acc,c) => acc || compareByKey(c, a, b), 0)

o

 const sortByKey = (criteria) => (a, b) => { let comparedValue = 0; for (const c of criteria) { comparedValue = compareByKey(c, a, b); if (comparedValue) return comparedValue; } return comparedValue; } 

 const arrayOfObjects = [{ name: 'John', age: 30, city: 'New York', details: { occupation: 'developer', } }, { name: 'Jane', age: 25, city: 'Paris', details: { occupation: 'designer', } }, // added another designer for testing { name: 'Jane 2', age: 30, city: 'Paris', details: { occupation: 'designer', } } ]; const sortByKey = (criteria) => (a, b) => { let returnValue = 0; criteria.find(c => returnValue = compareByKey(c, a, b)); return returnValue; } function compareByKey({ key, order = 'asc' }, a, b) { const varA = resolvePath(key, a) const varB = resolvePath(key, b) let comparison = 0; if (varA > varB) { comparison = 1; } else if (varA < varB) { comparison = -1; } if (order === 'desc') { comparison *= -1 } return comparison } // This function is used to resolve the path of a key in an object function resolvePath(path, obj) { return path.split('.').reduce(function(prev, curr) { return prev ? prev[curr] : null }, obj || self) } console.log(arrayOfObjects.sort(sortByKey([ { key: 'details.occupation' }, { key: 'age', order: 'desc' } ])))

about 4 years ago · Santiago Trujillo Denunciar

0

Puedes probar :

 const arrayOfObjects = [{ id: 3, name: 'Jane', age: 25, city: 'Paris', details: { occupation: 'designer', } }, { id: 1, name: 'John', age: 30, city: 'New York', details: { occupation: 'developer', } }, { id: 2, name: 'Bob', age: 25, city: 'New York', details: { occupation: 'developer', } }, ]; let sortByKey = function (a, b, keys) { for (let key of keys) { if (a[key.key] != b[key.key]) return (a[key.key] > b[key.key] ? 1 : -1) * (key.order == 'desc' ? -1 : 1); } return 0; } let result = arrayOfObjects.sort((a, b) => sortByKey(a, b, [{ key: 'age' }, { key: 'city', order: 'desc' }])); console.log(result);
about 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda