Ordenamiento de Arrays con JavaScript

Haremos uso del método Sort para ordenar arreglos en base a diferente orientación usando JavaScript.

Rodríguez Patiño, Eduardo
2020-09-20 | 1,405 lecturas

En KODOTI hicimos una trivia sobre ordenamientos de arreglos usando el método Sort de JavaScript. La trivia fue la siguiente:

Si tu esperabas que la respuesta fuera:

[1, 4, 6, 8, 10]

Pues me temo que no, porque el método Sort ordena como si se tratará de una cadena. Por ende el resultado correcto es:

[1, 10, 4, 6, 8]

APLICANDO EL ORDENAMIENTO CORRECTO PARA NÚMEROS

El método sorter recibe un parámetro adicional que es un callback y lo usa para aplicar un criterio de comparación. Pues la API de JavaScript nos ha hecho fácil el camino, sino del caso contrario deberíamos aplicar algoritmos como Bubble Sort, Quick Sort, Merge Sort, Selection Sort, etc.

ASCEDENTE

[10, 8, 1, 4, 6].sort((a, b) => a - b);

// output: 1, 4, 6, 8, 10

DESCEDENTE

[10, 8, 1, 4, 6].sort((a, b) => b - a);

// output: 10, 8, 6, 4, 1

¿Cómo funciona esto?, pues la respuesta exacta no la tengo porque depende de cada browser y sus developers como implementan los algortimos de ordenamiento. Pero si analizamos un poco, el callback de comparación recibe 2 parámetros y ejecuta una resta para determina si a es mayor que b o no al obtener un resultado positivo o negativo. Del caso diera 0, quiere decir que hay igualdad.

ORDENAMIENTO DE ARRAY DE OBJETOS

Podemos aplicar el mismo criterio para ordenar accediendo a las propiedades de nuestro objeto mediante la función de comparación.

Por ejemplo, dado el siguiente arreglo:

let data = [
    {user: 'Mariela', age: 31, role: 'SAC'},
    {user: 'Eduardo', age: 30, role: 'CEO'},
    {user: 'Andrés', age: 34, role: 'Project Manager'}
];

Queremos ordenar por la edad:

data.sort((a, b) => a.age - b.age)

[
    {user: 'Eduardo', age: 30, role: 'CEO'},
    {user: 'Mariela', age: 31, role: 'SAC'},
    {user: 'Andrés', age: 34, role: 'Project Manager'}
]

Y si lo queremos descedente:

data.sort((a, b) => b.age - a.age)

[
    {user: 'Andrés', age: 34, role: 'Project Manager'},
    {user: 'Mariela', age: 31, role: 'SAC'},
    {user: 'Eduardo', age: 30, role: 'CEO'}
]

ORDENANDO POR CADENAS

CADENAS SIMPLES

Si el array no es de objetos solo cadena, podemos usar Sort() sin especificar el parámetro.

let x = ['banana', 'orange', 'apple', 'strawberry'];
x.sort()

// output: [ 'strawberry', 'apple', 'orange', 'banana' ]

Si queremos un ordenamiento descedente deberemos hacer Reverse luego de ordenar ascedentemente porque el Reverse invierte los elementos, no usa un criterio de ordenación por abecedario.

let x = ['banana', 'orange', 'apple', 'strawberry'];
x.sort().reverse()

// output: [ 'strawberry', 'orange', 'banana', 'apple' ]

OBJETOS CON PROPIEDADES DE CADENA

Pero en el caso de ser un objeto debemos usar la función de comparación.

data.sort((a, b) => {
    if(a.user < b.user) return 1;
    if(a.user > b.user) return -1;

    return 0;
})

[
    {user: 'Andrés', age: 34, role: 'Project Manager'},
    {user: 'Eduardo', age: 30, role: 'CEO'},
    {user: 'Mariela', age: 31, role: 'SAC'}
]

Si buscamos descedente invertimos el retorno de 1 a -1 o cambiamos el mayor ">" a que sea menor "<".

data.sort((a, b) => {
    if(a.user < b.user) return -1;
    if(a.user > b.user) return 1;

    return 0;
})

[
    {user: 'Mariela', age: 31, role: 'SAC'},
    {user: 'Eduardo', age: 30, role: 'CEO'},
    {user: 'Andrés', age: 34, role: 'Project Manager'}
]