4

Ordenando cadenas con caracteres acentuados

Javascript tiene un método nativo sort que permite ordenar matrices. Haciendo un simple array.sort() va a tratar a cada entrada del array como una cadena y va a tratar de ordenarla alfabéticamente. Pero cuando intenta ordenar un array de caracteres no ASCII obtendrá un resultado extraño.

Javascript tiene un método nativo sort que permite ordenar arrays. Haciendo una simple array.sort() va a tratar a cada entrada de la matriz como una cadena y va a tratar de ordenarla alfabéticamente. También puede proporcionar la funcion own custom sorting.

['Shanghai', 'New York', 'Mumbai', 'Buenos Aires'].sort();
// ["Buenos Aires", "Mumbai", "New York", "Shanghai"]

Pero cuando intenta para un array de caracteres no ASCII como esto ['E', 'a', 'U', 'c'], se obtendrá un resultado extraño `[’ c ‘,’ e ‘,’ A ‘,’ U ‘]’. Eso sucede porque sort sólo funciona con el idioma Inglés.

Mire el siguiente ejemplo:

// Spanish
['único','árbol', 'cosas', 'fútbol'].sort();
// ["cosas", "fútbol", "árbol", "único"] // bad order

// German
['Woche', 'wöchentlich', 'wäre', 'Wann'].sort();
// ["Wann", "Woche", "wäre", "wöchentlich"] // bad order

Afortunadamente, hay dos maneras de superar este comportamiento localeCompare and Intl.Collator.

Ambos métodos tienen sus propios parámetros personalizados con el fin de configurarlo para que funcione adecuadamente.

Usando localeCompare()

['único','árbol', 'cosas', 'fútbol'].sort(function (a, b) {
  return a.localeCompare(b);
});
// ["árbol", "cosas", "fútbol", "único"]

['Woche', 'wöchentlich', 'wäre', 'Wann'].sort(function (a, b) {
  return a.localeCompare(b);
});
// ["Wann", "wäre", "Woche", "wöchentlich"]

Usando Intl.Collator()

['único','árbol', 'cosas', 'fútbol'].sort(Intl.Collator().compare);
// ["árbol", "cosas", "fútbol", "único"]

['Woche', 'wöchentlich', 'wäre', 'Wann'].sort(Intl.Collator().compare);
// ["Wann", "wäre", "Woche", "wöchentlich"]
  • Para cada método se puede personalizar la ubicación.
  • De acuerdo a Firefox Intl.Collator es más rápida cuando se compara un gran número de cadenas.

Así que cuando se trabaja con arrays de cadenas en un idioma distinto del Inglés, recuerde utilizar este método para evitar la clasificación inesperado.