Revista Informática

Obtener los índices para ordenar un vector en JavaScript

Publicado el 23 junio 2021 por Daniel Rodríguez @analyticslane
Obtener los índices para ordenar un vector en JavaScript

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


Volver a la Portada de Logo Paperblog