[JavaScript]Ordenar sequências de caracteres (nomes de arquivos) como no Windows.

この記事は約4分で読めます。
スポンサーリンク

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));

コメント

タイトルとURLをコピーしました