✅ Noticias, temas, complementos de WEB y WordPress. Aquí compartimos consejos y las mejores soluciones para sitios web.

Cómo crear un mapa bidireccional en JavaScript

19

Un mapa bidireccional es un modelo de la informática donde los pares clave-valor tienen una relación biyectiva 1-1 entre las claves y los valores. Esto nos permite no solo consultar por clave y obtener un valor, sino también consultar por valor y obtener la clave. Veamos cómo implementar un mapa bidireccional en JavaScript y luego hagámoslo seguro en TypeScript

La informática y las matemáticas detrás

Tomemos una definición básica de un mapa bidireccional:

En informática, un mapa bidireccional es una estructura de datos asociativa en la que los pares clave-valor forman una correspondencia uno a uno. Por lo tanto, la relación binaria es funcional en cada dirección: cada valor también se puede asignar a una clave única.

Cómo crear un mapa bidireccional en JavaScript

Crédito: Mapa bidireccional

El mapa bidireccional de la informática tiene sus raíces en una función matemática llamada biyección. La relación entre los componentes de un par con cada uno de sus componentes en diferentes conjuntos es una función biyectiva, también llamada función invertible, que es una función que funciona en ambos sentidos, emparejando exactamente un elemento de un conjunto con exactamente un elemento de el otro conjunto:

Cómo crear un mapa bidireccional en JavaScript

Crédito: biyección

Con esto en mente, podemos saber que una función biyectiva para los conjuntos anteriores producirá algo como:

f (1) = re
f (C) = 3

Otra cosa que surge de la función biyectiva es que los conjuntos tendrán exactamente la misma longitud, de lo contrario la biyección fallaría.

Inicializar el mapa bidireccional

Modelaremos esto con una clase de JavaScript que se inicializará con un objeto de pares clave-valor:

const bimap = new BidirectionalMap({ a: 'A', b: 'B', c: 'C', })

Internamente, crearemos dos listas. Una lista almacenará la lista de pares de lo que llamaremos un mapa directo, donde la clave se asigna al valor y será una copia del objeto que usamos para inicializar el mapa bidireccional. La segunda lista será lo que llamaremos un mapa inverso, y almacenará una versión del objeto utilizado para inicializar el mapa bidireccional donde los pares clave-valor se han invertido y el "valor" ahora se asigna a la "clave":

Tenga en cuenta que, debido a la naturaleza del objeto que inicializa el mapa bidireccional, no puede usar un número para la clave, pero aún puede usarlo como un valor y luego podrá consultarlo:

const bimap = new BidirectionalMap({ a: 42, b: 'B', c: 'C', })

Se podría escribir una versión más robusta aunque también más compleja con el tipo de datos Map de JavaScript y permitir claves que sean números, funciones o incluso NaN.

Obtener un elemento de un mapa bidireccional

Hasta este punto, tenemos una estructura de datos que alberga dos objetos, uno de ellos es un espejo del otro en términos de valores clave. Ahora necesitamos un método para sacar algo de eso. Implementemos una get()función:

get( key) { return this.fwdMap[key] || this.revMap[key] }

Es muy sencillo: si existe en el mapa directo, lo devolvemos, de lo contrario, lo devolvemos desde el mapa inverso. Si no existe, undefinedserá devuelto.

Ahora podemos obtener algunos elementos como:

console.log( bimap.get('a')) console.log( bimap.get('A'))

Agregar un elemento a un mapa bidireccional

Nuestro mapa actualmente no tiene una forma de agregar más elementos, así que agreguemos una función para agregar nuevos elementos al mapa:

add( pair) { this.fwdMap[pair[0]] = pair[1] this.revMap[pair[1]] = pair[0] }

Esto recibirá una matriz de dos elementos, que luego escribiremos como una tupla con TypeScript, y los asignaremos como valores clave en ambas direcciones a los objetos correspondientes.

Y ahora podemos agregar un par y consultar este nuevo par

bimap.add(['d', 'D']) console.log( bimap.get('D'))

Un mapa bidireccional seguro de tipos en TypeScript

Para mejorar las cosas y escribir con seguridad, podemos reescribir esto en TypeScript y agregar conceptos de escritura como un objeto genérico al inicializar el mapa y una tupla al agregar un nuevo elemento.

Esta tipificación ahora hace que nuestro mapa sea perfectamente seguro y garantiza, en este caso, que siempre usaremos cadenas tanto para las claves como para los valores.

Fuente de grabación: startfunction.com

This website uses cookies to improve your experience. We'll assume you're ok with this, but you can opt-out if you wish. Accept Read More