Las tablas hash son estructuras de datos que permiten la búsqueda rápida de valores asociados a claves. Son especialmente útiles cuando necesitamos acceso rápido a los datos y cuando las operaciones de inserción, eliminación y búsqueda deben ser muy eficientes.

¿Qué es una tabla hash?

Una tabla hash es una estructura de datos que asocia claves con valores. Usa una función hash para calcular un índice en una matriz de bloques, desde el cual se puede buscar el valor deseado. La eficiencia de una tabla hash se debe a que, idealmente, esta operación es de tiempo constante, O(1).

¿Cómo se usan las tablas hash en JavaScript?

En JavaScript, el objeto nativo `Map` es una implementación de tabla hash. Proporciona métodos para agregar, eliminar y obtener elementos de manera eficiente. Aquí hay un ejemplo práctico de cómo usar `Map` en JavaScript:

// Crear una nueva tabla hash
const hashTable = new Map();

// Agregar elementos
hashTable.set('key1', 'value1');
hashTable.set('key2', 'value2');
hashTable.set('key3', 'value3');

// Obtener un elemento
const value1 = hashTable.get('key1');
console.log(value1); // Output: 'value1'

// Verificar si existe una clave
const hasKey2 = hashTable.has('key2');
console.log(hasKey2); // Output: true

// Eliminar un elemento
hashTable.delete('key2');

// Obtener el número de elementos
const size = hashTable.size;
console.log(size); // Output: 2

¿Cuándo usar tablas hash?

  • Cuando necesitas realizar búsquedas rápidas de elementos.
  • Cuando frecuentemente agregas y eliminas elementos.
  • Cuando trabajas con grandes cantidades de datos y la eficiencia es crucial.

Ejemplo Funcional

Aquí hay un ejemplo funcional para ilustrar el uso de una tabla hash en una situación más realista: un sistema de inventario para una tienda:

// Crear la tabla hash para el inventario
const inventario = new Map();

// Agregar productos al inventario
inventario.set('manzanas', { cantidad: 50, precio: 0.5 });
inventario.set('bananas', { cantidad: 100, precio: 0.3 });
inventario.set('naranjas', { cantidad: 75, precio: 0.4 });

// Buscar un producto
const producto = inventario.get('bananas');
console.log(producto); // Output: { cantidad: 100, precio: 0.3 }

// Actualizar la cantidad de un producto
if (inventario.has('manzanas')) {
  inventario.get('manzanas').cantidad += 25;
}

console.log(inventario.get('manzanas')); // Output: { cantidad: 75, precio: 0.5 }

// Eliminar un producto
inventario.delete('naranjas');

console.log(inventario.size); // Output: 2

Este ejemplo demuestra cómo se pueden agregar, buscar, actualizar y eliminar elementos en una tabla hash, lo que es útil para aplicaciones donde la eficiencia y rapidez en el manejo de datos son esenciales.

Un enfoque mas facíl de entender

Además de usar `Map`, también podemos hacer uso directo de un objeto en JavaScript, poniendo en el key la llave requerida para la búsqueda. A continuación, se muestra un ejemplo práctico de cómo usar un objeto para manejar un sistema de inventario en una tienda:

let inventario = {
  'manzanas': { cantidad: 10, precio: 0.5 },
  'naranjas': { cantidad: 20, precio: 0.75 }
};

// Agregar un nuevo ítem al inventario
inventario['bananas'] = { cantidad: 15, precio: 0.9 };

// Buscar un ítem en el inventario
console.log(inventario['manzanas']); // { cantidad: 10, precio: 0.5 }

// Actualizar un ítem en el inventario
inventario['naranjas'].cantidad = 25;

// Eliminar un ítem del inventario
delete inventario['bananas'];

Este enfoque es fácil de entender y usar, pero tiene algunas desventajas en comparación con `Map`.

El uso de `Map` es más eficiente y ofrece varias características adicionales. Por ejemplo, los objetos en JavaScript solo pueden usar cadenas como claves, mientras que `Map` permite cualquier tipo de valor como clave (incluidos objetos, números, etc.). Además, `Map` mantiene el orden de inserción, lo cual puede ser útil en muchas aplicaciones.

let inventario = new Map();

// Agregar un nuevo ítem al inventario
inventario.set('manzanas', { cantidad: 10, precio: 0.5 });
inventario.set('naranjas', { cantidad: 20, precio: 0.75 });
inventario.set('bananas', { cantidad: 15, precio: 0.9 });

// Buscar un ítem en el inventario
console.log(inventario.get('manzanas')); // { cantidad: 10, precio: 0.5 }

// Actualizar un ítem en el inventario
let naranjas = inventario.get('naranjas');
naranjas.cantidad = 25;
inventario.set('naranjas', naranjas);

// Eliminar un ítem del inventario
inventario.delete('bananas');

Ejemplo (Playground)

En resumen, aunque el uso directo de un objeto es válido y funcional, el uso del objeto nativo `Map` en JavaScript es generalmente más eficiente y versátil para las operaciones relacionadas con la gestión de claves y valores.

Recursos

Map() constructor - JavaScript | MDN
The Map() constructor creates Map objects.
developer.mozilla.org
Map() constructor - JavaScript | MDN