¿Cómo funciona el método sort de arrays en JavaScript?

Publicado el 27.11.2021 a las 18:36

¿Cómo funciona el método sort de arrays en JavaScript?

¿Cómo funciona el método sort de arrays en JavaScript?

Comprende de una vez cómo funciona el método sort

Comprendiendo el método sort

El método sort es un método de ordenación que tienen los arrays en Javascript.


Si llamas al método sort directamente sobre un array, te darás cuenta que tiene un comportamiento esperado si el array contiene strings pero si el array contiene números lo devuelto por el método no es lo esperado.


Esto es lo que ocurriría con un array de strings:

const stringArray = ['Trek', 'Cube', 'Cannondale', 'Merida', 'specialized'];
stringArray.sort();
console.log(stringArray); //[LOG]: ["Cannondale", "Cube", "Merida", "Trek", "Specialized"]
        

Esto es lo que ocurriría con un array de números:

const numberArray = [23, 1, 245, 33, 1523];
numberArray.sort();
console.log(numberArray); //[LOG]: [1, 1523, 23, 245, 33]
        

¿Por qué con strings lo hace bien pero con números no?

El motivo es que el método sort utiliza el valor unicode del elemento a ordenar. Es decir, que cuando quieres ordenar números el método sort lo interpreta como un string, por eso en el ejemplo el 1523 va delante del 23.


El método sort acepta una función de comparación que es opcional, y podemos usar esta función para pasarle toda la lógica que precisemos. A dicha función se le pasarán dos parámetros, normalmente a y b por convención y sobre esos dos parámetros ejecutaremos la función y devolveremos un número que podrá ser:

  • 0 en el caso de que a y b sean iguales
  • un valor negativo si queremos que a si situe delante de b
  • un valor positivo si queremos que b si situe delante de a

Lo vemos con el ejemplo anterior de los números:

const numberArray = [23, 1, 245, 33, 1523];
numberArray.sort((a,b)=>{
  if(a===b) return 0;
  if(a>b) return -1; //para que a se situe delante de b
  if(a<b) return 1; //para que a se situe detrás de b
});
console.log(numberArray); //[LOG]: [1, 23, 33, 245, 1523]
                

Ahora sí lo ha hecho bien.


Por motivos didácticos he escrito la lógica anterior, pero su puede simplificar a:

const numberArray = [23, 1, 245, 33, 1523];
numberArray.sort((a,b)=>{
  return a-b;
});
console.log(numberArray); //[LOG]: [1, 23, 33, 245, 1523]
                                    

Hasta luego 🖖

Servicios

Software

IoT

Digitalización

Aplicaciones móviles

Consultoría

fjmduran.com v0.2.2