JavaScript

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

¿Te ha parecido de utilidad el contenido?

Daniel Rodríguez

Share
Published by
Daniel Rodríguez

Recent Posts

Cómo Verificar la Normalidad de tus Datos antes de un Test Estadístico

Antes de aplicar muchos tests estadísticos clásicos (el t-test, el ANOVA, la regresión lineal) aparece…

21 horas ago

Docker Compose: el día a día. Cómo ver qué funciona y qué no

Si acabas de montar tu aplicación en Docker Compose, la primera pregunta que haces cada…

3 días ago

Migrar tslane a un paquete dual CommonJS y ESM con tsup y Vitest

tslane es la plantilla que uso como punto de partida para mis librerías TypeScript, nacida…

1 semana ago

Cómo construir tu primer scorecard paso a paso

En los artículos anteriores de esta serie vimos la teoría detrás del credit scoring: qué…

1 semana ago

Actualizar expresslanets a ES Modules con tsx y Vitest

expresslanets es la plantilla de API REST con Express y TypeScript que empezó como una…

2 semanas ago

Pareto/NBD: cuando el abandono silencioso cambia el CLV

En el artículo del Dashboard vimos que Pareto/NBD aparecía junto a BG/NBD con un ajuste…

2 semanas ago

This website uses cookies.