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 localeCompare
podemos 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!