Command Palette

Search for a command to run...

Métodos Inmutables: toSorted, toReversed y toSpliced

Aprende a manipular arrays sin modificar el original usando los nuevos métodos inmutables de ES2023, ideales para programación funcional y React.

Lectura: 14 min
Nivel: Intermedio

TL;DR - Resumen rápido

  • toSorted() ordena arrays creando una copia sin modificar el original
  • toReversed() invierte el orden de elementos preservando el array original
  • toSpliced() elimina, inserta o reemplaza elementos de forma inmutable
  • Estos métodos son esenciales para programación funcional y React
  • Evita efectos secundarios inesperados usando métodos inmutables

Introducción a la Inmutabilidad en Arrays

La inmutabilidad es un principio fundamental en programación funcional y frameworks modernos como React. Significa que los datos no se modifican directamente, sino que se crean nuevas versiones con los cambios deseados. Antes de ES2023, JavaScript tenía métodos mutables como sort(), reverse() y splice() que modificaban el array original, lo que podía causar bugs difíciles de rastrear.

Los nuevos métodos toSorted(), toReversed() y toSpliced() introducidos en ES2023 resuelven este problema proporcionando versiones inmutables de estos métodos populares. Estos métodos retornan un nuevo array con los cambios aplicados, dejando el array original intacto. Esto es especialmente útil en React donde la inmutabilidad es un requisito para que los componentes se actualicen correctamente.

  • Evitar efectos secundarios inesperados en tu código
  • Facilitar el debugging con historial de cambios
  • Mejorar el rendimiento en frameworks como React con memoización
  • Hacer el código más predecible y fácil de testear
  • Seguir principios de programación funcional pura

Compatibilidad del Navegador

Los métodos inmutables de arrays (toSorted(), toReversed(), toSpliced()) son parte de ES2023. Son compatibles con navegadores modernos. Para navegadores antiguos, necesitarás un polyfill o transpilación con Babel.

El Método toSorted()

El método toSorted() ordena los elementos de un array y retorna un nuevo array ordenado, sin modificar el original. Acepta una función comparadora opcional que define el criterio de ordenamiento, similar a sort(). Por defecto, ordena elementos como strings en orden alfabético ascendente.

Ordenamiento Básico

La diferencia fundamental entre sort() y toSorted() es que sort() modifica el array original mientras que toSorted() crea una nueva copia ordenada. Esta distinción es crucial cuando necesitas preservar el array original para otras operaciones o cuando trabajas con código que no debe tener efectos secundarios.

tosorted-basico.js
Loading code...

Este ejemplo muestra claramente cómo sort() modifica el array original, lo cual puede causar problemas inesperados si otros partes del código dependen del orden original. En contraste, toSorted() preserva el array original y retorna una nueva versión ordenada, lo que es más seguro y predecible.

Ventaja en React

En React, usar toSorted() es esencial porque los cambios de estado deben ser inmutables. Si usas sort() directamente en el estado, React no detectará el cambio y el componente no se actualizará.

Funciones Comparadoras

Al igual que sort(), toSorted() acepta una función comparadora personalizada que define cómo ordenar los elementos. Esta función recibe dos elementos y retorna un número negativo si el primero debe ir antes, positivo si debe ir después, o cero si son iguales. Esto permite ordenar objetos por propiedades específicas o implementar criterios de ordenamiento complejos.

tosorted-comparador.js
Loading code...

Los ejemplos demuestran cómo ordenar arrays de objetos usando diferentes criterios. El primero ordena por precio numérico, el segundo alfabéticamente por nombre usando localeCompare() para manejar correctamente caracteres especiales y acentos, y el tercero en orden descendente invirtiendo la resta de los valores.

El Método toReversed()

El método toReversed() invierte el orden de los elementos en un array y retorna una nueva copia invertida, sin modificar el array original. Es la versión inmutable de reverse() y es particularmente útil cuando necesitas procesar datos en orden inverso temporalmente, como mostrar historial de cambios o elementos más recientes primero.

toreversed-basico.js
Loading code...

Este ejemplo muestra cómo reverse() modifica el array original, mientras que toReversed() crea una copia invertida preservando el original. Este comportamiento es esencial cuando necesitas mantener el orden original para otras operaciones o cuando trabajas con código que no debe tener efectos secundarios.

Casos de Uso Comunes

toReversed() es ideal para mostrar historial de cambios en orden inverso (más reciente primero), procesar pilas (LIFO), o cuando necesitas iterar sobre elementos en orden opuesto temporalmente sin alterar el array original.

El Método toSpliced()

El método toSpliced() elimina, inserta o reemplaza elementos en un array y retorna una nueva copia con los cambios aplicados, sin modificar el original. Es la versión inmutable de splice() y acepta los mismos parámetros: índice de inicio, cantidad de elementos a eliminar, y elementos opcionales a insertar.

Eliminación e Inserción Básica

toSpliced() es extremadamente flexible: puedes eliminar elementos, insertar nuevos, o reemplazar elementos existentes en una sola operación. A diferencia de splice(), no modifica el array original, lo que evita efectos secundarios inesperados y hace el código más predecible.

tospliced-basico.js
Loading code...

Este ejemplo muestra las capacidades de toSpliced() para eliminar e insertar elementos. El primer caso elimina elementos y los retorna, mientras que el segundo caso solo elimina sin insertar. En ambos casos, el array original permanece inalterado, lo cual es crucial para mantener la integridad de los datos.

Casos Avanzados de toSpliced()

toSpliced() soporta índices negativos, que cuentan desde el final del array, y también funciona correctamente cuando el índice está fuera del rango del array. Esto lo hace muy flexible para manipular arrays en diversas situaciones sin necesidad de validaciones adicionales.

tospliced-avanzado.js
Loading code...

Estos ejemplos demuestran la flexibilidad de toSpliced(). Puedes insertar al inicio o final sin eliminar, reemplazar elementos específicos, eliminar múltiples elementos del medio, usar índices negativos para contar desde el final, o incluso especificar índices fuera del rango para insertar al final automáticamente.

Diferencia con with()

toSpliced() es para eliminar/insertar múltiples elementos, mientras que with() (otro método inmutable de ES2023) es solo para reemplazar un elemento específico. Usa toSpliced() cuando necesites más flexibilidad.

Errores Comunes

Al trabajar con métodos inmutables de arrays, hay varios errores comunes que los desarrolladores cometen, especialmente cuando están migrando código existente o cuando no comprenden completamente la diferencia entre métodos mutables e inmutables. Entender estos errores te ayudará a escribir código más robusto y evitar bugs sutiles.

errores-comunes.js
Loading code...

El primer error es olvidar que métodos como sort() modifican el array original, lo cual puede causar bugs cuando otras partes del código dependen del orden original. El segundo error es usar slice() antes de métodos mutables para crear copias, lo cual es verboso y propenso a errores. El tercer error es encadenar múltiples copias en lugar de usar métodos inmutables directamente.

Cuándo Usar Cada Método

Usa métodos inmutables (toSorted(), toReversed(), toSpliced()) cuando necesitas preservar el array original. Usa métodos mutables (sort(), reverse(), splice()) solo cuando estás seguro de que no necesitas el array original después.

Resumen: Métodos Inmutables de Arrays

Conceptos principales:

  • toSorted() ordena arrays creando una copia sin modificar el original
  • toReversed() invierte el orden preservando el array original
  • toSpliced() elimina, inserta o reemplaza elementos de forma inmutable
  • Estos métodos aceptan las mismas funciones comparadoras que sus versiones mutables
  • Son esenciales para programación funcional y frameworks como React

Mejores prácticas:

  • Usa métodos inmutables por defecto en código funcional y React
  • Evita métodos mutables cuando necesitas preservar el array original
  • Combina métodos inmutables en lugar de crear múltiples copias
  • Usa localeCompare() para ordenar strings correctamente
  • Documenta cuándo y por qué usas métodos inmutables