我需要一种在 Javascript 中像在 Windows 中一样对字符串进行排序的方法,但这似乎是不可能的。
Windows 资源管理器排序如下:
1.jpg - 2.jpg - 3.jpg - ....
Javascript 的排序如下:
1.jpg - 10.jpg - 11.jpg - 2.jpg -...
Windows 根据文件名中的数字值排序,而 Javascript 仅根据字符的 ASCII 代码排序。
有时文件名不仅仅是数字或文本,而是两者的组合,例如:
"mark 01 in school.jpg"
"mark 02 in school.jpg"
"john 05 in theater.jpg"
我需要的是一个如上所示排序的 Javascript 函数。
我的问题是:JS中有一个函数吗?或者我如何自己实现一个函数?
您必须编写自己的排序函数并将其作为参数传递给排序方法。简单的例子:
your_array.sort(sortfunction)
function sortfunction(a, b){
var num1 = extractNumberFrom(a);
var num2 = extractNumberFrom(b);
return num1 - num2;
}
只需创建一个排序回调,首先对字符串进行排序,然后检查数字并对它们进行正确排序,就像
var arr = [
"test2.jpg",
"test10.jpg",
"test1.jpg",
"test11.jpg"
]
arr.sort(function(a,b) {
for (var i = 0; i < a.length; i++) {
var _a = a.charAt(i),
_b = b.charAt(i),
_c = _a.localeCompare(_b);
if ( _c != 0 ) return isNaN(_a) || isNaN(_b) ? a.localeCompare(b) : _a - _b;
}
});
document.body.innerHTML = '<pre>' + JSON.stringify(arr, null, 4) + '</pre>';
我创建了一个
flexibleSort
函数,它首先检查数组中的所有文件名是否仅包含数字。如果它只有数字,那么它将把它作为整数/数字进行比较,否则它将把它当作字符串。
var arr_number = ["2.jpg", "1.jpg", "3.jpg"];
var arr_string = ["mark 01 in school.jpg","mark 02 in school.jpg","john 05 in theater.jpg"];
var arr_number_1 = ["1.jpg","10.jpg","11.jpg","2.jpg"];
flexibleSort(arr_number);
flexibleSort(arr_string);
flexibleSort(arr_number_1);
function flexibleSort(obj){
var all_number = true;
$.each(obj, function(index, value){
if(!$.isNumeric(value.split(".")[0])){
all_number = false;
}
});
if(all_number === true){
obj.sort(function(a, b){return parseInt(a.split(".")[0])-parseInt(b.split(".")[0])});
}else{
obj.sort(function(a, b){return a > b});
}
$.each(obj, function(index, value){
$('#result').append("<p>"+value+"</p>");
});
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>
<div id="result"></div>
您可以尝试以下算法进行排序。 它根据字符排序。
这里是应用 natsort 函数的另一个示例:
// natural sort algorithm in JavaScript by Miigon.
// 2021-03-30
//
// GitHub: https://github.com/miigon/
function natSort(arr){
return arr.map(v=>{ // split string into number/ascii substrings
let processedName = []
let str = v
for(let i=0;i<str.length;i++) {
let isNum = Number.isInteger(Number(str[i]));
let j;
for(j=i+1;j<str.length;j++) {
if(Number.isInteger(Number(str[j]))!=isNum) {
break;
}
}
processedName.push(isNum ? Number(str.slice(i,j)) : str.slice(i,j));
i=j-1;
}
// console.log(processedName);
return processedName;
}).sort((a,b) => {
let len = Math.min(a.length,b.length);
for(let i=0;i<len;i++) {
if(a[i]!=b[i]) {
let isNumA = Number.isInteger(a[i]);
let isNumB = Number.isInteger(b[i]);
if(isNumA && isNumB) {
return a[i]-b[i];
} else if(isNumA) {
return -1;
} else if(isNumB) {
return 1;
} else {
return a[i]<b[i] ? -1 : 1 ;
}
}
}
// in case of one string being a prefix of the other
return a.length - b.length;
}).map(v => v.join(''));
}
let a = ['a2','a1b10z','b1a2','a1b10','a33','7','a3','a22','a1b2','abbbb','a1b1','aaaaa','a10','a1','10'];
console.log(natSort(a).join('\n'))
此外,还有一个特殊软件包可以安装。