JavaScript - 对 FileList 对象进行自然排序
JavaScript - Natural Sorting a FileList Object
我有一个包含 1000 多个图像文件的文件列表对象。我希望对象按文件名排序,文件名是字母数字。换句话说,我想做一个自然排序。文件名是这样的:
d_1_ct.png
d_2_ct.png
d_3_ct.png
d_4_ct.png
通过执行 [].slice.call(filelist_object)
或 Array.from(filelist_object)
将文件列表对象转换为数组,然后调用 sort()
结果仅按字母顺序排序。如何使文件列表对象按文件名自然排序?
我可以将其转换为数组,只要我能够在数组元素上使用 URL.createObjectURL()
显示图像文件即可。
自然排序字母数字字符串不是我想要的,尽管我在文件列表对象中的文件名是字母数字字符串。文件列表对象包含以下属性:
0: File
lastModified: 1493435514308
lastModifiedDate: Sat Apr 29 2017 08:41:54 GMT+0530 (India Standard Time)
name: "d_1_ct.png"
size: 5307
type: "image/png"
webkitRelativePath: "img/d_1_ct.png"
__proto__:File
我想在 name
或 webkitRelativePath
上排序,同时保留文件列表对象的所有属性,因为我使用对象的索引号来显示图像。
我首先使用 Array.from()
将文件列表对象转换为数组。
myArray = Array.from(myFileListObject);
然后,我使用了 Lauri Rooden 编写的 naturalCompare()
函数。这是 GitHub link.
然后我在数组上调用了 naturalCompare()
函数,如下所示:
myArray.sort(function(a,b) {
return String.naturalCompare(a.name, b.name)
});
我的数组现在 "naturally" 排序正确。它仍然保留了 filelist 对象的所有属性,所以我仍然可以在其内容上使用 URL.createObjectURL()
方法来显示图像。
很长一段时间,我为德语解决了这个问题"Umlaute"你可以适应这个...
function fhwSort(a, b){
function fhwSplit(fstring){
var mapObj = {
ä:"ae",
ö:"oe",
ü:"ue",
Ä:"ÄE",
Ö:"ÖE",
Ü:"UE",
ß:"ss"
};
fstring = fstring.replace(/ä|ö|ü|Ä|ö|ü|ß/gi, function(matched){
return mapObj[matched];
});
return fstring.toUpperCase().replace(/\d*/g, function (x) {
return !x=="" ? '0'.repeat(20).substr(0,20-x.length)+x:'';});
}
a=fhwSplit(a["name"]);
b=fhwSplit(b["name"]);
return (a>b)+(a<b)*-1;
}
var data = [
{name : "5.1. Test 3"},
{name : "5.1. Test 1"},
{name : "5.2. Test 2"},
{name : "5.10. Test 10"},
{name : "5.12. Test 12"},
{name : "Karl"},
{name : "Kader"},
{name : "Käse"},
{name : "Kuchen"}
];
console.log("fhwSort");
data.sort(fhwSort);
for (var i = 0; i < data.length; i++){
console.log(data[i]["name"]);
}
现在有一种使用 localeCompare
的更简单的方法:http://fuzzytolerance.info/blog/2019/07/19/The-better-way-to-do-natural-sort-in-JavaScript/
const items = ['3rd', 'Apple', '24th', '99 in the shade', 'Dec', '10000', '101', '.23']
items.sort((a, b) => a.localeCompare(b, navigator.languages[0] || navigator.language, {numeric: true, ignorePunctuation: true}))
console.log(items)
// [ ".23", "3rd", "24th", "99 in the shade", "101", "10000", "Apple", "Dec" ]
此外,您可以通过 declaring the collator object beforehand 加快速度。
我有一个包含 1000 多个图像文件的文件列表对象。我希望对象按文件名排序,文件名是字母数字。换句话说,我想做一个自然排序。文件名是这样的:
d_1_ct.png
d_2_ct.png
d_3_ct.png
d_4_ct.png
通过执行 [].slice.call(filelist_object)
或 Array.from(filelist_object)
将文件列表对象转换为数组,然后调用 sort()
结果仅按字母顺序排序。如何使文件列表对象按文件名自然排序?
我可以将其转换为数组,只要我能够在数组元素上使用 URL.createObjectURL()
显示图像文件即可。
自然排序字母数字字符串不是我想要的,尽管我在文件列表对象中的文件名是字母数字字符串。文件列表对象包含以下属性:
0: File
lastModified: 1493435514308
lastModifiedDate: Sat Apr 29 2017 08:41:54 GMT+0530 (India Standard Time)
name: "d_1_ct.png"
size: 5307
type: "image/png"
webkitRelativePath: "img/d_1_ct.png"
__proto__:File
我想在 name
或 webkitRelativePath
上排序,同时保留文件列表对象的所有属性,因为我使用对象的索引号来显示图像。
我首先使用 Array.from()
将文件列表对象转换为数组。
myArray = Array.from(myFileListObject);
然后,我使用了 Lauri Rooden 编写的 naturalCompare()
函数。这是 GitHub link.
然后我在数组上调用了 naturalCompare()
函数,如下所示:
myArray.sort(function(a,b) {
return String.naturalCompare(a.name, b.name)
});
我的数组现在 "naturally" 排序正确。它仍然保留了 filelist 对象的所有属性,所以我仍然可以在其内容上使用 URL.createObjectURL()
方法来显示图像。
很长一段时间,我为德语解决了这个问题"Umlaute"你可以适应这个...
function fhwSort(a, b){
function fhwSplit(fstring){
var mapObj = {
ä:"ae",
ö:"oe",
ü:"ue",
Ä:"ÄE",
Ö:"ÖE",
Ü:"UE",
ß:"ss"
};
fstring = fstring.replace(/ä|ö|ü|Ä|ö|ü|ß/gi, function(matched){
return mapObj[matched];
});
return fstring.toUpperCase().replace(/\d*/g, function (x) {
return !x=="" ? '0'.repeat(20).substr(0,20-x.length)+x:'';});
}
a=fhwSplit(a["name"]);
b=fhwSplit(b["name"]);
return (a>b)+(a<b)*-1;
}
var data = [
{name : "5.1. Test 3"},
{name : "5.1. Test 1"},
{name : "5.2. Test 2"},
{name : "5.10. Test 10"},
{name : "5.12. Test 12"},
{name : "Karl"},
{name : "Kader"},
{name : "Käse"},
{name : "Kuchen"}
];
console.log("fhwSort");
data.sort(fhwSort);
for (var i = 0; i < data.length; i++){
console.log(data[i]["name"]);
}
现在有一种使用 localeCompare
的更简单的方法:http://fuzzytolerance.info/blog/2019/07/19/The-better-way-to-do-natural-sort-in-JavaScript/
const items = ['3rd', 'Apple', '24th', '99 in the shade', 'Dec', '10000', '101', '.23']
items.sort((a, b) => a.localeCompare(b, navigator.languages[0] || navigator.language, {numeric: true, ignorePunctuation: true}))
console.log(items)
// [ ".23", "3rd", "24th", "99 in the shade", "101", "10000", "Apple", "Dec" ]
此外,您可以通过 declaring the collator object beforehand 加快速度。