Compartir en Twitter
Go to Homepage

ESTRUCTURAS DE DATOS EN JAVASCRIPT: EJEMPLOS PRÁCTICOS DE CÓDIGO

August 12, 2025

Introducción a las estructuras de datos en JavaScript

JavaScript es uno de los lenguajes de programación más utilizados en el desarrollo web actual. Su facilidad de aprendizaje y la amplia comunidad de desarrolladores lo convierten en una herramienta fundamental. Sin embargo, un aspecto crucial que a menudo se pasa por alto es el manejo eficiente de las estructuras de datos.

Las estructuras de datos principales en JavaScript permiten organizar y almacenar información de manera eficiente, facilitando el acceso y la manipulación de grandes volúmenes de datos. Cada estructura posee características específicas que la hacen adecuada para diferentes escenarios y necesidades.

Arrays: almacenamiento y acceso eficiente a datos

Los arrays son una de las estructuras más comunes y versátiles en JavaScript. Permiten almacenar múltiples valores en una sola variable, ya sean números, cadenas, objetos u otras estructuras. Su eficiencia radica en la capacidad de acceder rápidamente a los elementos mediante índices.

Para crear un array vacío y agregar elementos, se utiliza el método push():

const frutas = [];
frutas.push("Manzana");
frutas.push("Banana");
frutas.push("Naranja");

El acceso a los elementos se realiza mediante índices, comenzando en cero:

console.log(frutas[0]); // Manzana

Para recorrer un array, se puede usar un ciclo for o la función forEach():

frutas.forEach(function (fruta) {
    console.log(fruta);
});

Estos métodos facilitan la manipulación de colecciones de datos de forma sencilla y eficiente.

Objetos: versatilidad en propiedades y métodos

Los objetos en JavaScript son estructuras que almacenan propiedades y métodos, permitiendo representar entidades complejas con atributos y comportamientos. Cada propiedad es un par clave-valor, y los métodos son funciones asociadas que pueden interactuar con dichas propiedades.

Ejemplo básico de un objeto con propiedades y un método:

let usuario = {
    nombre: "Juan",
    edad: 30,
    correo: "[email protected]",
    saludar: function () {
        console.log(
            "Hola, mi nombre es " +
                this.nombre +
                " y tengo " +
                this.edad +
                " años."
        );
    },
};

usuario.saludar();
// Output: Hola, mi nombre es Juan y tengo 30 años.

Esta estructura permite modelar desde usuarios hasta componentes complejos en aplicaciones web, facilitando la organización y reutilización del código.

Listas vinculadas: manejo dinámico de datos variables

Las listas vinculadas son ideales cuando la cantidad de datos puede variar dinámicamente. A diferencia de los arrays, no requieren un tamaño fijo y permiten insertar o eliminar elementos sin reorganizar toda la estructura.

Cada nodo contiene un valor y una referencia al siguiente nodo, formando una cadena:

class Node {
    constructor(value, next) {
        this.value = value;
        this.next = next;
    }
}

class LinkedList {
    constructor() {
        this.head = null;
        this.tail = null;
    }

    push(value) {
        const newNode = new Node(value, null);

        if (!this.head) {
            this.head = newNode;
            this.tail = newNode;
        } else {
            this.tail.next = newNode;
            this.tail = newNode;
        }
    }
}

Para recorrer la lista:

let current = linkedList.head;

while (current) {
    console.log(current.value);
    current = current.next;
}

Esta estructura es especialmente útil cuando se requiere flexibilidad en la gestión de datos.

Pilas y colas: control de orden en ingreso y salida

Las pilas y colas son estructuras que controlan el orden en que se agregan y eliminan elementos. En las pilas, el último elemento ingresado es el primero en salir (LIFO), mientras que en las colas, el primer elemento ingresado es el primero en salir (FIFO).

Implementación básica de una pila con array:

let pila = [];
pila.push("elemento 1");
pila.push("elemento 2");
let ultimo = pila.pop();
console.log(ultimo); // elemento 2

Implementación básica de una cola con array:

let cola = [];
cola.push("elemento 1");
cola.push("elemento 2");
let primero = cola.shift();
console.log(primero); // elemento 1

Estas estructuras son fundamentales para resolver problemas donde el orden de procesamiento es crítico.

Árboles y grafos: estructuras para relaciones complejas

Los árboles permiten organizar datos jerárquicamente, con un nodo raíz y múltiples niveles de nodos hijos. Son útiles para representar estructuras como sistemas de archivos o componentes de interfaces.

Ejemplo de árbol en JavaScript:

const tree = {
    value: "A",
    children: [
        { value: "B", children: [] },
        { value: "C", children: [] },
    ],
};

Los grafos representan relaciones complejas entre nodos mediante conexiones múltiples. Se pueden implementar con matrices o listas de adyacencia:

const graph = [
    [0, 1, 1],
    [1, 0, 0],
    [1, 0, 0],
];

Estas estructuras permiten modelar sistemas complejos y analizar relaciones entre datos.

Hash tables: búsqueda y almacenamiento eficiente

Las hash tables son estructuras que permiten almacenar y buscar datos rápidamente mediante claves únicas. En JavaScript, los objetos funcionan como hash tables, facilitando el acceso directo a valores mediante claves.

Ejemplo de hash table:

const miHash = {
    a: 1,
    b: 2,
    c: 3,
};

console.log(miHash["b"]); // 2

Su eficiencia radica en la complejidad constante para operaciones de búsqueda y almacenamiento.

Algoritmos de búsqueda y ordenamiento

Manipular grandes volúmenes de datos requiere algoritmos eficientes para buscar y ordenar información. La búsqueda lineal y la búsqueda binaria son técnicas comunes para localizar elementos.

Ejemplo de búsqueda binaria:

function binarySearch(arr, val, start = 0, end = arr.length - 1) {
    if (start > end) return -1;
    let mid = Math.floor((start + end) / 2);
    if (arr[mid] === val) return mid;
    if (arr[mid] > val) return binarySearch(arr, val, start, mid - 1);
    return binarySearch(arr, val, mid + 1, end);
}

const sortedArray = [1, 2, 4, 5, 8, 9];
console.log(binarySearch(sortedArray, 8)); // 4

Para ordenar datos, algoritmos como el ordenamiento por selección permiten organizar elementos de forma eficiente:

function selectionSort(arr) {
    for (let i = 0; i < arr.length; i++) {
        let minIndex = i;
        for (let j = i + 1; j < arr.length; j++) {
            if (arr[j] < arr[minIndex]) minIndex = j;
        }
        [arr[i], arr[minIndex]] = [arr[minIndex], arr[i]];
    }
    return arr;
}

console.log(selectionSort([5, 9, 2, 4, 1, 8]));

Seleccionar el algoritmo adecuado mejora el rendimiento y la eficiencia del código.

Conclusiones

El dominio de las estructuras de datos en JavaScript es esencial para desarrollar aplicaciones eficientes y escalables. Desde los arrays y objetos hasta las estructuras más complejas como listas vinculadas, árboles y grafos, cada una ofrece ventajas específicas para diferentes escenarios.

Además, comprender y aplicar algoritmos de búsqueda y ordenamiento optimiza la manipulación de datos, mejorando el rendimiento general de las aplicaciones. La correcta elección y uso de estas herramientas permite a los desarrolladores escribir código más claro, mantenible y eficiente.

Incorporar estas prácticas en el desarrollo diario es fundamental para enfrentar los desafíos que presenta la programación moderna y para construir soluciones tecnológicas robustas y efectivas.