Coisas que eu quero fazer
Esta função ordena uma matriz de strings (principalmente nomes de arquivos) da mesma forma que o Windows ordena nomes de arquivos.
fundo
Vejamos os resultados quando simplesmente ordenamos da seguinte forma.
código:
filenames.sort();entrada:
filenames = ["10","1","2","a","A","b","B","い","ア","あ"]Resultado:
['1', '10', '2', 'A', 'B', 'a', 'b', 'あ', 'い', 'ア']Este método de ordenação classifica os caracteres de acordo com sua codificação (maior ou menor).
Portanto, os números deveriam ser organizados como 1 , 2 , 10 , mas aparecem como 1 , 10 , 2 .
Além disso, os resultados da classificação para hiragana, katakana e o alfabeto podem diferir do que você poderia esperar.
implementação
A implementação a seguir permite classificar arquivos de forma semelhante à classificação de arquivos do Windows (não verifiquei se são exatamente iguais, mas não encontrei nenhuma diferença, incluindo a disposição dos caracteres kanji).
código:
const collator = new Intl.Collator('ja-JP', { numeric: true, sensitivity: 'base' });
filenames.sort(collator.compare);entrada:
filenames = ["10","1","2","a","A","b","B","い","ア","あ"]Resultado:
['1', '2', '10', 'A', 'a', 'B', 'b', 'あ', 'ア', 'い']Os números serão organizados na mesma ordem em que você os desejaria na sequência 1 , 2 , 10 , portanto, estarão na sequência 1 , 10 , 2 .
Além disso, hiragana, katakana e o alfabeto são organizados de uma forma que se assemelha muito à intuição.
Por favor, altere ‘ja-JP’ dependendo do conjunto de caracteres da string que você está usando.
Implementação real
Na prática, raramente se ordena uma matriz de nomes de arquivos; quase sempre se ordenam os objetos de arquivo que contêm os nomes dos arquivos.
Para ordenar uma matriz de objetos que contém nomes de arquivos, você faria o seguinte: (arquivos é uma matriz de objetos que possui um nome, que armazena os nomes dos arquivos).
const collator = new Intl.Collator('ja-JP', { numeric: true, sensitivity: 'base' });
files.sort((a, b) => collator.compare(a.name, b.name));

コメント