Lucía lleva las inscripciones del club de natación de su barrio. Son ciento y pico chavales y una hoja que hasta ahora se ordenaba a mano. Un viernes por la tarde decidió hacerse una página pequeña para sacar la lista de dorsales ordenada por apellido. Una función, un sort(), y a imprimir.
La lista salió con Zamora a media página y, detrás, Álvarez, Écija e Íñiguez, como si se hubieran apuntado tarde. Y al final del todo, «de la Fuente» y «del Río», los de la minúscula.
Lo que hace sort() cuando no le dices nada
Abrió Elffuss Code, pegó la función con tres nombres reales que salían mal y le preguntó al modelo por qué. La respuesta fue directa: sin comparador, sort() compara unidades de código UTF-16, no letras. Las mayúsculas van antes que las minúsculas y cualquier vocal con tilde acaba detrás de la zeta. No es un fallo del navegador. Es el comportamiento documentado, y casi nunca es lo que quieres para nombres de personas.
La propuesta fue crear un Intl.Collator('es', { sensitivity: 'base' }) y pasar su compare al sort. Álvarez volvió a la A, «de la Fuente» se colocó en la D y la eñe quedó donde la espera cualquiera que aprendiera el abecedario en castellano: entre la ene y la o.
El arreglo que se llevó a una nadadora
Animada, Lucía usó el mismo truco para otra cosa que le daba guerra, los duplicados. Hay familias que rellenan el formulario dos veces, una con «García» y otra con «Garcia». Escribió de memoria una comparación con localeCompare(b, undefined, { sensitivity: 'base' }), la probó en su portátil y funcionaba.
El lunes la abrió en el ordenador del club, que tiene el navegador en inglés, y en la lista faltaba una nadadora. Marta Peña y Marta Pena, dos niñas distintas de dos familias distintas, se habían quedado en una sola.
Volvió a preguntarle al modelo con esos dos nombres delante. Le explicó que ese undefined significa «usa el idioma del navegador», y que en la ordenación genérica la eñe es una ene con un acento encima. Con sensitivity: 'base' los acentos se ignoran, así que Peña y Pena empatan. En la ordenación española la ñ es una letra propia y nunca empata con la ene. Mismo código, dos resultados distintos según dónde se abra.
El arreglo final tiene dos partes:
- El idioma va fijado: 'es' escrito en el código, nunca heredado del navegador.
- Nada se fusiona en silencio: la página marca los posibles duplicados y decide Lucía. Un algoritmo puede sospechar que García y Garcia son la misma persona, pero confirmarlo le toca a alguien que conoce a las familias.
Por qué esto no podía ir a un chat cualquiera
Para depurarlo había que enseñarle al modelo los datos que fallaban: nombres y apellidos de menores, con la fecha de nacimiento al lado. Inventarse ejemplos no habría servido, porque el fallo solo aparecía con Peña y Pena juntas. Como el modelo corre en la propia pestaña, sobre la GPU de su ordenador, pegar esas filas no era mandar la ficha del club a ningún sitio. No tuvo que anonimizar nada ni pedir permiso a nadie, porque la lista nunca salió del navegador.
Lo que me llevo: cuando ordenas o comparas nombres de personas, el idioma es parte del dato. Si no lo fijas tú, lo decide el navegador de quien abra la página.
Abre Elffuss Code y depura tu próxima función con los datos de verdad: el modelo corre en tu navegador y no sube nada a ningún servidor.
Abrir Code →