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.
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.
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
En la era del dato, las organizaciones se enfrentan al reto de gestionar volúmenes masivos…
En la serie Creación de una API REST con Express y TypeScript construimos una API…
Durante la Segunda Guerra Mundial, la Fuerza Aérea de Estados Unidos quería reforzar sus aviones…
En muchas situaciones —ya sea para grabar un tutorial, tomar capturas de pantalla profesionales, probar…
Imagínate en una sala con un grupo de personas, por ejemplo, en una oficina, un…
En el trabajo diario con ordenadores, es común encontrarse con tareas repetitivas: realizar copias de…
This website uses cookies.