Saltar al contenido

¿Cómo funciona la función de clasificación en JavaScript, junto con la función de comparación?

Solución:

La función “comparar” debe tener dos argumentos, a menudo denominados a y B. Luego, hace que la función de comparación devuelva 0, mayor que 0 o menor que 0, según estos valores, a y B.

  1. Devuelve mayor que 0 si a es mayor que B
  2. Devuelve 0 si a es igual a B
  3. Devuelve menos de 0 si a es menos que B

Con estos tres valores de retorno y solo dos argumentos, es posible escribir una función de comparación que puede ordenar cualquier tipo de tipo de datos de entrada o estructuras de datos complejas.

Luego, cuando llama a sort (), con su función de comparación personalizada, la función de comparación se llama en pares en su lista por ordenar, para determinar el orden correcto.

Veamos un ejemplo simple … Supongamos que solo está ordenando algunos números, por lo que tenemos una función de comparación muy simple:

function compare(a,b) {
    return a - b;
}

Simplemente restar b de a siempre devolverá mayor que cero si a es mayor que b, 0 si son iguales o menor que cero si a es menor que b. Por lo tanto, cumple con los requisitos para una función de comparación.

Ahora supongamos que esta es nuestra lista de números para ordenar:

var numbers = [1,5,3.14];

Cuando usted llama numbers.sort(compare), internamente se ejecutará:

compare(1,5);     // Returns -4, a is less than b
compare(1,3.14);  // Return -2.14, a is less than b
compare(5,3.14);  // returns 1.86, a is greater than b

Si alguna vez ha realizado una clasificación manual o alfabetización, ha hecho exactamente lo mismo, probablemente sin darse cuenta. Aunque tenga docenas o cientos de elementos para comparar, está comparando constantemente solo dos números (o los apellidos del autor, o lo que sea) a la vez. Repasando o haciendo una breve lista de tres números nuevamente, comenzaría comparando los dos primeros números:

  1. ¿1 es mayor o menor que 5? Menos que, así que ponga estos dos números en nuestra lista: 1,5
  2. ¿3.14 es mayor o menor que 1? Mayor que, por lo que va después de 1 en la nueva lista
  3. ¿3.14 es mayor o menor que 5 en nuestra nueva lista? Menos que, por lo que va antes de 5. Nuestra nueva lista es ahora [1,3.14,5]

Debido a que puede proporcionar su propia función compare (), es posible ordenar datos arbitrariamente complejos, no solo números.

Por defecto, la matriz sort() el método ordena alfabéticamente ascendente. Si desea ordenar en algún otro orden, debido a que su matriz contiene números u objetos, puede pasar una función al sort().

La función que pasa toma dos parámetros, a menudo llamados ayb, y devuelve: un número negativo si el primer argumento debe ordenarse antes que el segundo (a b)

Ahora, aquí está la parte clave: la función que pasas como parámetro a sort() será llamado repetidamente por sort() ya que procesa toda la matriz. sort() no sabe ni le importa el tipo de datos de las cosas en la matriz: cada vez que necesita saber “¿El elemento A viene antes que el elemento B?” simplemente llama a tu función. No necesita preocuparse por el tipo de algoritmo de ordenación que utiliza internamente sort(), de hecho, un navegador puede usar un algoritmo diferente a otro, pero eso está bien porque solo tiene que proporcionar una forma para que compare dos elementos de su matriz.

Tu función podría tener un if / else if / else estructura para decidir qué resultado devolver, pero para los números que simplemente devuelvan (ab) lo logrará porque el resultado de la resta será -ve, 0 o + ve y colocará correctamente los números en orden ascendente. Regresar (ba) los pondría descendiendo:

  var sortedArray = myArray.sort(function(a,b){
                                    return (a-b);
                                });

Si tuviera una matriz de objetos y quisiera ordenar por alguna propiedad o propiedades particulares de los objetos, también podría hacerlo. Suponiendo, por ejemplo, objetos en este formato:

{ id : 1,
  name : "Fred",
  address : "12 Smith St",
  phone : "0262626262" }

Luego, podría ordenar una matriz de tales objetos por su atributo ‘id’ de la siguiente manera:

var sortedArray = myArray.sort(function(a,b){
                                  return (a.id - b.id);
                              });

O puede ordenar una matriz de tales objetos por su atributo ‘nombre’ (alfabético) de la siguiente manera:

var sortedArray = myArray.sort(function(a,b){
                                   if (a.name < b.name)
                                      return -1;
                                   else if (a.name == b.name)
                                      return 0;
                                   else
                                      return 1;
                               });

Tenga en cuenta que en mi ejemplo final he puesto el if / else if / else estructura que mencioné anteriormente.

Para el ejemplo en el que está ordenando objetos con múltiples propiedades, podría expandirlo aún más para incluir una ordenación secundaria, es decir, (en mi ejemplo) si las propiedades del nombre son iguales, entonces podría devolver una comparación de, digamos, la propiedad del teléfono.

Este método usa la sintaxis y los parámetros del orden de Array.sort (la función compareFunction the sortOptions), cuyos parámetros se definen de la siguiente manera:

compareFunction: una función de comparación utilizada para determinar el orden de clasificación de los elementos de la matriz. Este parámetro es opcional. La función de comparación debe usarse para comparar los dos parámetros. A y B de un elemento dado, el resultado de compareFunction puede tener un valor negativo, 0 o un valor positivo:

Si el valor devuelto es negativo, significa que A aparece antes que B en la secuencia ordenada. Si el valor de retorno es 0, entonces A y B tienen el mismo orden de clasificación. Si el valor devuelto es positivo, significa que A aparece después de B en la secuencia ordenada.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : /

Utiliza Nuestro Buscador

Deja una respuesta

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