Día 5 de 24: reverseString
Las 24 funciones antes de navidad
Hoy seguimos avanzando en nuestra serie, buscando cada día herramientas útiles que hacen más cómodo nuestro trabajo diario. En la entrega anterior vimos cómo generar slugs limpios para URLs, y ahora nos movemos a un terreno diferente: manipular texto de manera segura. La función de hoy se encarga de algo que parece simple, pero que en la práctica puede volverse complejo cuando entran en juego emojis, grafemas y caracteres compuestos.
reverseString
Esta función invierte una cadena respetando su estructura interna. A diferencia de soluciones tradicionales que simplemente voltean los caracteres, aquí se tiene en cuenta el tratamiento correcto de grafemas completos. Esto es especialmente útil cuando se trabaja con textos que incluyen emojis, secuencias con ZWJ o caracteres Unicode combinados.
Lo que la hace interesante es su capacidad para usar Intl.Segmenter cuando está disponible, lo que mejora notablemente la precisión en entornos modernos. En sistemas donde este soporte no existe, la función recurre a invertir por puntos de código, manteniendo un comportamiento confiable.
En definitiva, es ideal para cualquier proyecto que requiera trabajar con cadenas visualmente coherentes y correctamente ordenadas al invertirlas.
Código de la función
/**
* Invierte una cadena por puntos de código. Usa Intl.Segmenter si disponible
* para intentar preservar grafemas compuestos (ej. emojis con ZWJ), sino se limita a code points.
* @param {string} str
* @returns {string}
*/
export function reverseString(str) {
if (typeof str !== 'string') return '';
if (typeof Intl !== 'undefined' && Intl.Segmenter) {
const seg = new Intl.Segmenter('es', { granularity: 'grapheme' });
const parts = [...seg.segment(str)].map(s => s.segment);
return parts.reverse().join('');
}
const codePoints = Array.from(str);
return codePoints.reverse().join('');
}
Cómo usarla
Caso básico
reverseString('Hola');
// Resultado: 'aloH'
Con emojis
reverseString('Hola 👋🙂');
// Resultado: '🙂👋 aloH'
Con caracteres combinados
reverseString('café');
// Resultado esperado con Segmenter: 'éfac'
Escenario sin soporte para Intl.Segmenter
Si se ejecuta en un entorno antiguo, igual obtendrás una inversión coherente basada en puntos de código.
Cada día avanzamos un paso más en esta colección de utilidades que buscan mejorar la calidad y facilidad de nuestros desarrollos. Mañana continuaremos con otra función que complementa este recorrido navideño.
Compartir:
¿Te gustó este artículo? Apoya mi trabajo y ayúdame a seguir creando contenido.
Cómprame un café