我想做的事情
这段代码以与 Windows 对文件名进行排序相同的方式对字符串数组(主要是文件名)进行排序。
背景
让我们看看按以下方式排序后的结果。
代码:
filenames.sort();输入:
filenames = ["10","1","2","a","A","b","B","い","ア","あ"]结果:
['1', '10', '2', 'A', 'B', 'a', 'b', 'あ', 'い', 'ア']这种排序方法按字符编码(高或低)对字符进行排序。
因此,这些数字应该排列成1、2、10 ,但它们显示为1、10、2 。
此外,平假名、片假名和字母的排序结果可能与您预期的不同。
执行
以下实现允许您以类似于 Windows 文件名的方式对文件进行排序(我没有验证它们是否完全相同,但我找不到任何差异,包括汉字的排列方式)。
代码:
const collator = new Intl.Collator('ja-JP', { numeric: true, sensitivity: 'base' });
filenames.sort(collator.compare);输入:
filenames = ["10","1","2","a","A","b","B","い","ア","あ"]结果:
['1', '2', '10', 'A', 'a', 'B', 'b', 'あ', 'ア', 'い']这些数字将按照您希望它们在序列1、2、10中的顺序排列,因此它们将按序列1、10、2排列。
此外,平假名、片假名和字母的排列方式与直觉非常接近。
请根据您使用的字符串字符集更改 ja-JP。
实际执行
在实际应用中,你很少会对文件名数组进行排序;你几乎总是会对包含文件名的文件对象进行排序。
要对包含文件名的对象数组进行排序,您可以执行以下操作:(files 是一个对象数组,其中包含 name 字段,用于存储文件名。)
const collator = new Intl.Collator('ja-JP', { numeric: true, sensitivity: 'base' });
files.sort((a, b) => collator.compare(a.name, b.name));

コメント