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ámetro | Tipo | Descripción | Requerido |
|---|---|---|---|
str | string | undefined | String 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
undefinedsi 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
- stringToSlug - Convierte a slug (incluye remove diacritics)
- parseName - Parse de nombres completos