Ordenar matrices en JavaScript

    Como muchos otros lenguajes populares, JavaScript viene convenientemente con un m茅todo incorporado para ordenar matrices. Si bien el resultado final es el mismo, los distintos motores de JavaScript implementan este m茅todo utilizando diferentes algoritmos de ordenaci贸n:

    • V8: Clasificaci贸n r谩pida o clasificaci贸n por inserci贸n (para matrices m谩s peque帽as)
    • Firefox: combinar ordenaci贸n
    • Safari: Clasificaci贸n r谩pida, Clasificaci贸n por combinaci贸n o Clasificaci贸n por selecci贸n (seg煤n el tipo de matriz)

    La implementaci贸n realmente no importa para el c贸digo de llamada, pero es interesante ver estos algoritmos de clasificaci贸n usados 鈥嬧媏n la pr谩ctica despu茅s de aprender sobre ellos durante tanto tiempo en las clases de introducci贸n a CS.

    Esta funci贸n de clasificaci贸n est谩 disponible como m茅todo prototipo en el Array clase:

    Array.sort([compareFunc])
    

    En la verdadera forma de JavaScript, se pasa una devoluci贸n de llamada a esta funci贸n que se usa para decirle al algoritmo de clasificaci贸n c贸mo se comparan dos elementos entre s铆. los compareFunc debe tener dos par谩metros, a y b, y funciona as铆:

    • Si compareFunc devuelve 0, entonces los elementos se tratan como iguales
    • Si compareFunc devuelve 1 entonces b se ordena antes a
    • Si compareFunc devuelve -1 entonces a se ordena antes b

    La funci贸n no necesita necesariamente devolver 1 o -1, siempre y cuando los n煤meros devueltos sean 0, por encima de 0 o por debajo de 0. Por lo tanto, una funci贸n de comparaci贸n como (a, b) => a - b; es perfectamente v谩lido.

    Si el compareFunc no se proporciona, los elementos se convierten en cadenas y luego se ordenan alfab茅ticamente. Esto hace que la clasificaci贸n de cadenas sea trivial. Sin embargo, aunque parece que ordenar n煤meros deber铆a ser sencillo, en realidad puede ser un poco confuso aqu铆:

    > let nums = [3, 2, 6, 50, 10];
    > nums.sort()
    [ 10, 2, 3, 50, 6 ]
    

    Como puede ver, los n煤meros no est谩n en el orden que esperaba. Esto se debe a que, como se mencion贸 anteriormente, el m茅todo de clasificaci贸n predeterminado es convertir los elementos en cadenas antes de realizar la comparaci贸n. Y como cadena, “50” viene antes de “6”, por lo que 50 no es el 煤ltimo en la matriz. Para ordenar esta matriz correctamente, intente lo siguiente en su lugar:

    > let nums = [3, 2, 6, 50, 10];
    > nums.sort((a, b) => a - b);
    [ 2, 3, 6, 10, 50 ]
    

    Nota: Es importante tener en cuenta que este m茅todo ordena en el lugar, lo que significa que la matriz original est谩 realmente ordenada y no se realiza ninguna copia. Entonces, mientras el .sort() El m茅todo devuelve la matriz ordenada, en realidad no es necesario asignarla a nada, ya que la matriz a la que se llama est谩 ordenada.

    Si desea invertir el orden de clasificaci贸n, simplemente cambie la comparaci贸n de a y b. Entonces, si queremos que los n煤meros est茅n en orden descendente, debe hacer lo siguiente:

    > let nums = [3, 2, 6, 50, 10];
    > nums.sort((a, b) => b - a);
    [ 50, 10, 6, 3, 2 ]
    

    Ordenar matriz de objetos

    El uso de una funci贸n de comparaci贸n como esta hace que sea extremadamente f谩cil ordenar objetos personalizados en JavaScript. Por ejemplo, digamos que tenemos la siguiente lista de datos de usuario:

    let users = [
        {name: 'Scotty', age: '18'},
        {name: 'Tommy', age: '21'},
        {name: 'Sally', age: '71'},
        {name: 'Billy', age: '18'},
        {name: 'Timmy', age: '21'}
    ];
    

    Esto no es algo que el algoritmo de clasificaci贸n pueda simplemente interpretar y clasificar por s铆 mismo. El orden tambi茅n depende en gran medida de la aplicaci贸n. 驴Qu茅 pasa si queremos ordenar por edad y luego nombrar? Para hacerlo, podr铆amos proporcionar un comparador que combine los dos:

    users.sort((a, b) => {
        let keyA = a.age + a.name;
        let keyB = b.age + b.name;
        if (keyA < keyB) return -1;
        if (keyA > keyB) return 1;
        return 0;
    });
    

    Esto dar谩 como resultado la siguiente matriz ordenada:

    [ { name: 'Billy', age: '18' },
      { name: 'Scotty', age: '18' },
      { name: 'Timmy', age: '21' },
      { name: 'Tommy', age: '21' },
      { name: 'Sally', age: '71' } ]
    

    Observe que ahora todos los usuarios est谩n ordenados por edad. Y, seg煤n lo previsto, los usuarios con la misma edad se ordenan por nombre, como Billy y Scotty.

    Conclusi贸n

    En este breve art铆culo, vimos c贸mo usar el .sort() m茅todo para ordenar f谩cilmente matrices en JavaScript. Esto se aplica a cualquier tipo de datos, incluidas cadenas, n煤meros o incluso objetos. El orden de clasificaci贸n est谩 determinado por el compareFun m茅todo de devoluci贸n de llamada, que es lo que le permite determinar el orden de clasificaci贸n o qu茅 propiedades del objeto determinan el orden de clasificaci贸n.

     

    Etiquetas:

    Deja una respuesta

    Tu direcci贸n de correo electr贸nico no ser谩 publicada. Los campos obligatorios est谩n marcados con *