Reordenar un array

Cuando se crea un array con valores o se le van añadiendo posteriormente, todos los elementos se mantienen en el orden en el que se añadieron. El primero valor anotao es el elemnto 0 y el último es el elemento con índice la longitud del array menos uno.

Hay dos métodos que permiten modificar este orden

  • reverse(), pues si: invierte el orden
  • sort(), este es más útil: ordena los elementos.

El método reverse() no tiene ningún secreto, simplemente invierte el array el elemento que era el inicial parsa a ser el elemento final y viceversa.

var datos=[1,2,3,4,5,6,7];

datos.reverse();

console.log(datos);

Como verás si pruebas el ejemplo, este método modifica el array original inviertiendo el orden de los elementos.

Por su parte el método array.sort() ordena los elementos del array por orden alfabético, si son números los toma como cadenas numéricas.

Al igual que el anterior este método también modifica el array original y devuelve una referencia al mismo.

var datos=[6,5,4,9,19,17];

datos.sort();

console.log(datos);

var datos=['06','05','04','09','19','17'];

datos.sort();

console.log(datos);

Como ves la ordenación no es numérica sino alfabética, en el segundo caso la ordenación queda como si fuera numérica.

Pero sort da la opción de usar como argumento una función de llamada (callback) que permite establecer el criterio de ordenación. Con esto ya se puede ordenar cualquier cosa: strings, números, objetos, ascendente, descendente..

var datos=[6,5,4,9,19,17];

datos.sort(function(a,b){

   return a <b?1:-1

});

console.log(datos); //orden decreciente

Ahora están ordenados numéricamente. La función recibe dos argumentos, los dos elementos leídos en orden ascendente ([0],[1] - [1], [2]....) según este ciclo:

  • La función de ordenación recorre el array
  • Lee un par de elementos consecutivos (a, b)
  • Pasa los valores leídos a la función de ordenación
  • Si la función devuelve algo >0 pone primero b y luego a
  • Si la función devuelve algo <0 pone primero a y luego b
  • Si la función devuelve 0 los deja igual

De esta manera podemos ordenar según el criterio que queramos

Esto permite ordenar objetos

var datos=[

    {nombre: 'Juan', edad:23},

    {nombre: 'Ana', edad:30},

    {nombre: 'Marian', edad:21},

];

datos.sort(function(a,b){ return a.edad > b.edad?1:-1 });

datos.forEach(function(v,i){console.log(i+":"+v.nombre+" "+v.edad)});

En este caso se han ordenado los objetos que forman el array datos en orden creciente de edades. Fíjate que la lógica es muy simple: devolver positivo significa invertir posiciones y negativo no invertir.

  • Compara los argumentos si el primero es mayor que el segundo los invierto (la función devuelve 1, positivo), porque quiero orden creciente
  • Compara los argumentos si el primero es menor que el segundo no los invierto (la función devuelve -1, negativo), ya están en orden creciente