La función sort()
de Matlab además de devolver los datos ordenados también devuelve la posición de estos en el conjunto original en la nueva lista, algo que es muy útil cuando necesitamos ordenar los elementos de un vector en base a los valores de otro. Por ejemplo, si en un vector tenemos unos nombres y en otro unos valores asociados a los primeros es posible ordenar los nombres en base a los valores simplemente usando los índices devueltos por la función sort()
. Algo que en algunos casos necesito duplicar en JavaScript, para ello vamos a ver cómo se pueden obtener los índices para ordenar un vector simplemente usando map
.
Obtener los índices para ordenar un vector en JavaScript
El código que uso para obtener los índices para ordenar un vector en JavaScript es el que se muestra a continuación.
const x = [3, -1, 8, 5, 2]; const n = ['A', 'B', 'C', 'D', 'E']; const idx = x.map((e, i) => [e, i]).sort((a,b) => a[0] - b[0]).map(e => e[1]); // [ 1, 4, 0, 3, 2 ] const sorted = n.map((_, i, a) => a[idx[i]]); // [ 'B', 'E', 'A', 'D', 'C' ]
Un código en el que se parte de dos vectores con la misma longitud x
y n
. El primero de ellos es un vector de valores y el segundo es un vector con nombres. Si necesitamos ordenar los elementos de n
en base a los valores de x
simplemente necesitamos los índices, lo que se hace en la siguiente línea. En la que en primer lugar se aplica el método map
al vector x
, creando un nuevo vector donde el primer elemento es el valor y el segundo el índice. Una vez teñido el nuevo vector se puede usar el método sort
de este, usando como función de ordenación una que solamente tenga en cuenta el primer elemento del vector. Con lo que se obtiene un vector ordenado. Para conseguir los índices, solamente se tiene que usar el método map
para quedarnos con el segundo elemento del vector.
El vector idx
contiene los valores [ 1, 4, 0, 3, 2 ]
indicando que el segundo elemento del vector x
es el que tiene el elemento con el menor valor (-1) y así para el resto. Lo que se puede usar para ordenar el vector n
. En el ejemplo se ha empleado un método map
que obtiene el elemento del vector original en base a la posición indicada por idx
. Aunque esto también se podría conseguir con for
o foreach
.
Conclusiones
Hoy he compartido un pequeño truco para obtener los índices para ordenar un vector en JavaScript, algo que en algunas ocasiones es de utilidad. Para el problema planteado, posiblemente una mejor solución sería crear un objeto con ambos valores, crear un vector de éstos y usar el método sort
sobre estos. Lo que nos devolvería los elementos ordenados por lo que necesitemos en cada. Usando para ello un patrón más moderno y eficiente. Aunque el truco presentado también puede ser de utilidad en algunas ocasiones.
Imagen de Bruno /Germany en Pixabay