As cadeias de caracteres podem criar uma série de problemas em qualquer linguagem de programação. Seja uma string simples, uma string contendo emojis, entidades html e até mesmo caracteres acentuados, se não depurarmos os dados ou não fizermos as escolhas corretas de manipulação de strings, podemos nos prejudicar muito.


Ao examinar o o repositório JSTips de Joel Lovera, descobri um caso de string que ainda não havia encontrado (…provavelmente já encontrei, mas não notei): classificar caracteres acentuados para obter o resultado desejado. A verdade é que os caracteres acentuados são tratados de forma um pouco diferente do que o senhor imagina durante uma classificação:



// 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


Caramba, os caracteres acentuados não seguem simplesmente seus correspondentes caracteres não acentuados. Ao realizar uma etapa extra, ou seja, o localeComparepodemos garantir que nossas cadeias de caracteres sejam classificadas da maneira que provavelmente queríamos em primeiro lugar:



['ú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"]

// Or even use 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"]


A localização já é um grande desafio sem a confusão adicional que vem com os caracteres acentuados. Manter localeCompare e Intl.Collator sempre que o senhor quiser classificar strings!