今天在做一个对文件夹名称排序的需求,百度找了几圈没找到有js关于文件名排序的。 加上本人是个新手,所以折腾大半天终于搞定了、分享一下给有需要的小伙伴。
windows文件名排序的风格是: 特殊字符>数字>字母>中文 ,所以按照这个思路对文件名的每个字符进行对比即可。
/**
*
* @param {对数组文件名进行 模仿windows的命名来排序} arr
*/
function mb_PaiXu(a, b) {
//获取2个字符串最短的
//设置如果相比前面字符都一样,那么则最短的调换位置
var len = a.length, re = -1;
if (a.length > b.length) { //获取最短的那个字符串长度
len = b.length;
re = 1;
}
//循环对每个字符串遍历对比
for (var i = 0; i < len; i++) {
var n1 = f_HuoQuZiFuLeiXing(a[i]); //获取当前字符的类型, 4特殊符号 3数字 2字母 1中文
var n2 = f_HuoQuZiFuLeiXing(b[i]);
if (a[i] == b[i] && n1 != 3)//如果2个字符相等,并且不是数字则不对比
continue;
if (n1 > n2) //不同类型的, 特殊字符>数字>字母>中文 可以直接换位置
return -1;
else if (n1 < n2)//不同类型的,换相反位置
return 1;
else { //2个是同类型的,那需要进行同类的的对比
//相同类型的对比
if (n1 == 4) //特殊字符,直接返回不对比
return -1;
if (n1 == 3)//数字的时候的比较方式,是获取后面的全部数字对比
{
// alert(a.substring(i)+" "+b.substring(i));
var num1 = parseInt(a.substring(i));
var num2 = parseInt(b.substring(i));
if (num1 == num2) //如果数字相等,那么也跳过不对比
continue;
return num1 - num2; //
}
else if (n1 == 2)//字母的比较方式, 转成小写字母后对比
{
return a[i].toLowerCase() > b[i].toLowerCase();
}
else if (n1 == 1)//中文字符
{
return a[i].localeCompare(b[i]);
}
}
}
// alert("结束:" + a + " " + b);
return re;
}
/**
*
* @param {获取字符属于哪种类型} str
*/
function f_HuoQuZiFuLeiXing(str) {
var a;
if (/[@\/'\\"#$%&()\^*]/.test(str)) { //特殊字符
a = 4;
}
else if (/^\+?[1-9][0-9]*$/.test(str)) { //数字
a = 3;
}
else if (/[a-z]/i.test(str)) { //字母
a = 2;
}
else { //剩下的就是中文了
a = 1;
}
return a;
}
使用方法
var arr=["哈哈1","11测试","哈哈11","哈哈3"];
arr.sort(mb_PaiXu);
经过测试没问题,至于性能方面,就不知道啦。 本人菜鸡一个
网友评论