Ordenar array de strings alfabéticamente a partir de dos palabras con JavaScript vanilla

Supongamos que tenemos una lista con 8 de los múltiples delitos en los que, según CNN, se encuentra enredado el expresidente colombiano Álvaro Uribe Vélez; y necesitamos organizarla alfabéticamente por la primera y segunda palabra de cada delito; ¿qué hacemos?

Si bien el método .sort() de javascript nos puede ayudar con esta tarea, por sí sola nos permitirá organizar la lista por la primera letra de su primera palabra, entonces, ¿qué debemos hacer para que el método sort() haga su trabajo a partir de dos (o más) criterios y no sólo por uno, como lo hace por default?

const expedientesAlvaroUribe = [
 "Falsos testigos",
 "Injuria contra Daniel Samper Ospina",
 "Falsos positivos",
 "Masacres El Aro y La Granja",
 "Interceptaciones ilegales o “chuzadas” del DAS",
 "Fraude procesal",
 "Delitos de lesa humanidad en Antioquia",
 "Nexos con paramilitares",
]

Empecemos por lo más básico, el método Array.sort() nos permite comparar y ordenar los delitos por los que se acusa a Álvaro Uribe.

Para implementarlo necesitas pasar un callback con dos argumentos que puedes llamar como quieras; cada uno de ellos hace referencia a los elementos que se comparan a medida que la función recorre el array que llamamos “ExpedientesAlvaroUribe”.

expedientesAlvaroUribe.sort((delito_a, delito_b)=>{
 console.log(delito_a)
 console.log(delito_b)
})

// Output en la consola...

//Injuria contra Daniel Samper Ospina
//Falsos testigos
//Falsos positivos
//Injuria contra Daniel Samper Ospina
//Masacres El Aro y La Granja
//Falsos positivos
//Interceptaciones ilegales o “chuzadas” del DAS
//Masacres El Aro y La Granja
//Fraude procesal
//Interceptaciones ilegales o “chuzadas” del DAS
//Delitos de lesa humanidad en Antioquia
//Fraude procesal
//Nexos con paramilitares
//Delitos de lesa humanidad en Antioquia

Si durante la comparación se retorna -1, el primer elemento comparado se colocará antes del segundo elementos, por el contrario, si se retorna 1 el segundo elemento comparando se colocará antes del primero y si se retorna 0 no habrá ningún cambio en los elementos.

A. Ordenar alfabéticamente por la primera palabra

Para ordenar la colección de strings con los diferentes delitos de Álvaro Uribe, vamos a necesitar dos cosas:

1. Pasar todo el string a minúsculas usando el método .toLowerCase()
2. Tomar la primera letra del string y convertirla en un número entero para poderla comparar, para eso implementamos el método .chartCodeAt() el cual toma como parámetro el índice dentro del string, de la letra que queremos trabajar, para retornar un número entero entre 0 y 65.535

expedientesAlvaroUribe.sort((delito_a, delito_b)=>{

// Si el primer elemento tiene un número superior, se posiciona arriba
// Si el primer elemento tiene un número inferior, se posiciona abajo

if(delito_a.toLowerCase().charCodeAt(0) < delito_b.toLowerCase().charCodeAt(0)) return -1;
 if(delito_a.toLowerCase().charCodeAt(0) > delito_b.toLowerCase().charCodeAt(0)) return 1;

})
Ahora la colección de delitos de Álvaro Uribe se ve así:

// Output en la consola...

// 0: "Delitos de lesa humanidad en Antioquia"
// 1: "Falsos testigos"
// 2: "Falsos positivos"
// 3: "Fraude procesal"
// 4: "Injuria contra Daniel Samper Ospina"
// 5: "Interceptaciones ilegales o “chuzadas” del DAS"
// 6: "Masacres El Aro y La Granja"
// 7: "Nexos con paramilitares"

B. Ordenar alfabéticamente por la segunda palabra

Nuestra colección ya se encuentra ordenada alfabéticamente por la primera letra de cada palabra, pero no por la segunda; para lograr esto, básicamente tenemos que hacer lo mismo, pero con un paso extra, veamos:

1. Debemos identificar la segunda palabra del string, para eso vamos a implementar el método .split() el cual nos permite dividir el string por el carácter que le pasemos (en este caso será el espacio); del resultado tomaremos la palabra con posición 1 dentro del nuevo array.
2. Implementamos los mismos métodos del punto A

expedientesAlvaroUribe.sort((delito_a, delito_b)=>{

 if(delito_a.toLowerCase().charCodeAt(0) < delito_b.toLowerCase().charCodeAt(0)) return -1;
 if(delito_a.toLowerCase().charCodeAt(0) > delito_b.toLowerCase().charCodeAt(0)) return 1;


 if(delito_a.split(' ')[1].toLowerCase().charCodeAt(0) < delito_b.split(' ')[1].toLowerCase().charCodeAt(0)) return -1;
 if(delito_a.split(' ')[1].toLowerCase().charCodeAt(0) > delito_b.split(' ')[1].toLowerCase().charCodeAt(0)) return 1;

})

console.log(expedientesAlvaroUribe)

// Output en la consola...

// 0: "Delitos de lesa humanidad en Antioquia"
// 1: "Falsos positivos"
// 2: "Fraude procesal"
// 3: "Falsos testigos"
// 4: "Injuria contra Daniel Samper Ospina"
// 5: "Interceptaciones ilegales o “chuzadas” del DAS"
// 6: "Masacres El Aro y La Granja"
// 7: "Nexos con paramilitares"

Si necesitáramos ordenar el arreglo de strings por una tercera palabra, dentro del callback implementaríamos los pasos del punto B.

No está de más mencionar que con el método .sort() también se pude ordenar una colección de objetos por letras y número, pero eso es un tema para otro tutorial.

Post a Comment

Artículo Anterior Artículo Siguiente