JS 10: Arrays y Sets

Almacena múltiples valores y domina su manipulación.

Creación y Acceso

Un array es una variable especial que puede contener más de un valor a la vez.

const coches = ["Saab", "Volvo", "BMW"];

const vacio = []; // Array vacío

Acceder a Elementos

Los índices empiezan en 0.

let coche = coches[0]; // "Saab"

coches[0] = "Opel"; // Modificar
coches.length; // 3 (Número de elementos) coches[coches.length - 1]; // Acceder al último (Forma tradicional) coches.at(-1); // Acceder al último (Forma moderna y limpia)

Métodos Básicos

let frutas = ["Banana", "Naranja"];

frutas.push("Kiwi"); // ["Banana", "Naranja", "Kiwi"]

let x = frutas.pop(); // x es "Kiwi"

Manipulación Avanzada

Concatenar (Unir)

const chicas = ["Cecilie", "Lone"];

const chicos = ["Emil", "Tobias", "Linus"];

const todos = chicas.concat(chicos);

Splice (Empalmar)

Se usa para añadir o eliminar elementos en cualquier posición.

// (posición, cuantos_borrar, elementos_a_añadir...)

frutas.splice(2, 0, "Limón", "Kiwi"); 

frutas.splice(0, 1); // Borra el primero

Slice (Rebanar)

Crea un nuevo array a partir de un trozo de otro (no modifica el original).

const citricos = frutas.slice(1); // Desde el índice 1 hasta el final

const parte = frutas.slice(1, 3); // Desde el 1 hasta el 3 (sin incluir)

Búsqueda y Ordenación

const numeros = [4, 9, 16, 25];

let mayorQue18 = numeros.find(x => x > 18); // 25

Ordenar

frutas.sort(); // Orden alfabético (modifica el original)

frutas.reverse(); // Invierte el orden
puntos.sort((a, b) => a - b);

✨ Métodos Inmutables (ES2023)

Históricamente, sort() y reverse() mutaban (rompían) el array original. Ahora tenemos versiones que devuelven un nuevo array:

  • toSorted(): Crea una copia ordenada.
  • toReversed(): Crea una copia invertida.
  • toSpliced(): Crea una copia con cambios de splice.
const original = [3, 1, 2];
const ordenado = original.toSorted(); 
// original sigue siendo [3, 1, 2]
// ordenado es [1, 2, 3]

🧠 Explicación "Para Humanos" del (a - b)

La pregunta del millón es: ¿Por qué si da negativo lo pone antes?

Es simplemente una REGLA (un contrato) que inventaron los creadores de JavaScript. Es como obedecer a un semáforo:

Resultado resta (a - b) Significado Real Orden del "Portero" (La Regla)
Negativo (-) A es menor que B Poner A a la izquierda (Antes) ⬅️
Positivo (+) A es mayor que B Poner A a la derecha (Después) ➡️
Cero (0) Son iguales Dejarlos quietos 😐

Por eso a - b ordena de menor a mayor:
Si tienes 5 y 100 -> la resta 5 - 100 da -95 (Negativo).
Y la regla dice: "¿Salió negativo? Pues el primero (5) va a la izquierda".

🕵️‍♀️ Curiosidad nivel PRO: ¿Cómo lo hace por dentro?

Si te preguntas si compara "el 1º con el 2º" y luego sigue... la respuesta es: depende del tamaño.

Para listas pequeñas (como [4, 5, 3, 2, 1, 0]), JavaScript usa la estrategia de "Ordenar Cartas" (Insertion Sort):

  1. Empieza por la izquierda. Ve el 4 y el 5. ¿Están bien? Sí (4 < 5). Se quedan así.
  2. Llega el 3. No lo compara solo con el siguiente, sino que mira hacia atrás buscando su sitio:
    • ¿3 vs 5? Gana 3. (Pasa delante)
    • ¿3 vs 4? Gana 3. (Pasa delante)
    • ¡Sitio encontrado! Se queda el primero.

Resumen: No recorre la lista ciegamente hacia adelante. Toma cada número nuevo y lo "inserta" en el hueco correcto de los que ya tiene ordenados a su izquierda.

*Para listas gigantes usa algoritmos más complejos (Timsort) que dividen y vencen, pero la lógica base de comparar parejas se mantiene.

Iteración (Recorrer Arrays)

La forma moderna y funcional de trabajar con listas.

ℹ️ Contexto para los ejemplos: Usaremos este array de números:

const numeros = [4, 9, 16, 25];

forEach()

Ejecuta una función por cada elemento.

numeros.forEach(num => console.log(num));

map()

Crea un nuevo array transformando cada elemento.

const doble = numeros.map(num => num * 2); // [8, 18, 32, 50]

filter()

Crea un nuevo array con los elementos que pasan un test.

const mayores = numeros.filter(num => num > 18); // [25]

reduce()

Reduce el array a un único valor (de izquierda a derecha).

const suma = numeros.reduce((total, num) => total + num, 0); // 54

every() y some()

Sets (Conjuntos)

Colecciones de valores únicos.

Un Set es una colección de valores únicos (sin duplicados). A diferencia de los Arrays, no tienen índices (no puedes pedir el elemento 0, el 1...).

Creación

const miSet = new Set();
miSet.add(1);
miSet.add(5);
miSet.add(5); // Ignorado (ya existe)

// O desde un array
const nombres = new Set(["Ana", "Pepe", "Ana"]); // {"Ana", "Pepe"}

Métodos y Propiedades

console.log(nombres.has("Ana")); // true
nombres.delete("Pepe");
console.log(nombres.size); // 1

Iteración

Se pueden recorrer igual que los Arrays con for...of o forEach.

for (const nombre of nombres) {
    console.log(nombre);
}

Truco PRO: Eliminar Duplicados de un Array

La forma más rápida de limpiar un Array usando Sets y el operador spread (...).

const numeros = [1, 2, 2, 3, 3, 4];
const unicos = [...new Set(numeros)]; 
// [1, 2, 3, 4]
Volver a JS