Saltar al contenido principal

removeDiacritics

Paquete: @tiendana/utils

Remueve acentos y marcas diacríticas de caracteres, convirtiéndolos a sus equivalentes base. Mantiene la estructura del texto pero sin acentos.

Características​

✅ Remueve acentos de vocales (á→a, é→e, etc.)
✅ Convierte caracteres especiales (ñ→n, ç→c, etc.)
✅ Soporta caracteres latinos extendidos
✅ Mantiene mayúsculas/minúsculas
✅ No altera espacios ni puntuación
✅ Basado en librería probada (node-diacritics)

Firma​

function removeDiacritics(str?: string): string | undefined

Parámetros​

ParámetroTipoDescripciónRequerido
strstring | undefinedString del cual remover diacríticos❌

Retorno​

Tipo: string | undefined

String con diacríticos removidos, o undefined si el input es undefined.

Ejemplos de Uso​

Conversión Básica​

import { removeDiacritics } from '@tiendana/utils';

removeDiacritics('José María');
// 'Jose Maria'

removeDiacritics('Äpfel über München');
// 'Apfel uber Munchen'

removeDiacritics('São Paulo');
// 'Sao Paulo'

removeDiacritics('Ñoño');
// 'Nono'

Búsqueda Sin Acentos​

interface User {
name: string;
email: string;
}

function searchUsers(query: string, users: User[]): User[] {
const normalizedQuery = removeDiacritics(query.toLowerCase());

return users.filter(user => {
const normalizedName = removeDiacritics(user.name.toLowerCase());
return normalizedName?.includes(normalizedQuery || '');
});
}

const users = [
{ name: 'José García', email: 'jose@example.com' },
{ name: 'María López', email: 'maria@example.com' },
{ name: 'Ángel Pérez', email: 'angel@example.com' }
];

searchUsers('Jose', users);
// [{ name: 'José García', ... }]

searchUsers('Maria', users);
// [{ name: 'María López', ... }]

Comparación Case-Insensitive​

function compareNames(name1: string, name2: string): boolean {
const normalized1 = removeDiacritics(name1.toLowerCase());
const normalized2 = removeDiacritics(name2.toLowerCase());

return normalized1 === normalized2;
}

compareNames('José', 'Jose'); // true
compareNames('María', 'Maria'); // true
compareNames('Ñoño', 'Nono'); // true

Normalizar para Base de Datos​

function normalizeForDatabase(text: string): string {
return removeDiacritics(text) || '';
}

const userData = {
name: 'José',
city: 'São Paulo',
searchName: normalizeForDatabase('José'),
searchCity: normalizeForDatabase('São Paulo')
};

// {
// name: 'José',
// city: 'São Paulo',
// searchName: 'Jose',
// searchCity: 'Sao Paulo'
// }

Filtros de Búsqueda​

interface Product {
name: string;
description: string;
}

function filterProducts(searchTerm: string, products: Product[]): Product[] {
const normalizedSearch = removeDiacritics(searchTerm.toLowerCase());

return products.filter(product => {
const normalizedName = removeDiacritics(product.name.toLowerCase());
const normalizedDesc = removeDiacritics(product.description.toLowerCase());

return normalizedName?.includes(normalizedSearch || '') ||
normalizedDesc?.includes(normalizedSearch || '');
});
}

Autocompletado​

interface Suggestion {
value: string;
label: string;
}

function getAutocompleteSuggestions(
input: string,
suggestions: Suggestion[]
): Suggestion[] {
const normalizedInput = removeDiacritics(input.toLowerCase());

return suggestions.filter(suggestion => {
const normalizedLabel = removeDiacritics(suggestion.label.toLowerCase());
return normalizedLabel?.startsWith(normalizedInput || '');
});
}

const suggestions = [
{ value: '1', label: 'José García' },
{ value: '2', label: 'María López' },
{ value: '3', label: 'Ángel Pérez' }
];

getAutocompleteSuggestions('Jose', suggestions);
// [{ value: '1', label: 'José García' }]

Ordenamiento Alfabético​

function sortByName<T extends { name: string }>(items: T[]): T[] {
return items.sort((a, b) => {
const nameA = removeDiacritics(a.name.toLowerCase()) || '';
const nameB = removeDiacritics(b.name.toLowerCase()) || '';
return nameA.localeCompare(nameB);
});
}

const people = [
{ name: 'Ángel' },
{ name: 'Ana' },
{ name: 'José' }
];

sortByName(people);
// [{ name: 'Ana' }, { name: 'Ángel' }, { name: 'José' }]

Generación de Usernames​

function generateUsername(fullName: string): string {
const normalized = removeDiacritics(fullName.toLowerCase()) || '';
return normalized
.replace(/\s+/g, '_')
.replace(/[^a-z0-9_]/g, '');
}

generateUsername('José María García');
// 'jose_maria_garcia'

generateUsername('Ângelo Müller');
// 'angelo_muller'

Validación de Email​

function normalizeEmail(email: string): string {
const [localPart, domain] = email.split('@');
const normalizedLocal = removeDiacritics(localPart.toLowerCase()) || '';
const normalizedDomain = removeDiacritics(domain.toLowerCase()) || '';

return `${normalizedLocal}@${normalizedDomain}`;
}

normalizeEmail('José.García@example.com');
// 'jose.garcia@example.com'

Casos de Uso Comunes​

  • Búsquedas: Búsqueda sin sensibilidad a acentos
  • Comparaciones: Comparar strings ignorando diacríticos
  • Normalización de datos: Preparar datos para almacenamiento
  • Filtros: Filtros de búsqueda flexibles
  • Autocompletado: Sugerencias sin importar acentos
  • Usernames: Generar usernames sin caracteres especiales
  • SEO: Normalizar URLs y meta tags
  • Ordenamiento: Ordenar alfabéticamente sin interferencia de acentos

Caracteres Soportados​

Vocales con Acentos​

  • A: À, Á, Â, Ã, Ä, Å, Ā, Ă, Ą → A
  • E: È, É, Ê, Ë, Ē, Ĕ, Ė, Ę, Ě → E
  • I: Ì, Í, Î, Ï, Ĩ, Ī, Ĭ, Į, İ → I
  • O: Ò, Ó, Ô, Õ, Ö, Ø, Ō, Ŏ, Ő → O
  • U: Ù, Ú, Û, Ü, Ũ, Ū, Ŭ, Ů, Ű, Ų → U

Caracteres Especiales​

  • Ñ/ñ → N/n
  • Ç/ç → C/c
  • Æ/æ → AE/ae
  • Œ/œ → OE/oe
  • ß → ss
  • Ð/ð → Dh/dh
  • Þ/þ → Th/th

Notas Técnicas​

  • Performance: O(n) donde n es la longitud del string
  • Unicode: Usa mapeo de caracteres Unicode extenso
  • Mayúsculas: Preserva mayúsculas/minúsculas del carácter base
  • Espacios: No altera espacios ni puntuación
  • Null safety: Retorna undefined si el input es undefined
  • Inmutabilidad: No modifica el string original
  • Basado en: node-diacritics (MIT License)

Limitaciones​

No es lo mismo que normalize()

Esta función NO es equivalente a String.prototype.normalize(). Hace mapeo directo de caracteres a sus equivalentes ASCII, mientras que normalize() descompone caracteres en sus componentes:

// removeDiacritics
removeDiacritics('café'); // 'cafe'

// normalize (requiere procesamiento adicional)
'café'.normalize('NFD').replace(/[\u0300-\u036f]/g, ''); // 'cafe'

Ver También​