最近做项目,需要对表格行排序,表格数据是个二维数组。 一般情况的根据二维数组某个属性值进行排序,都是比较首字母的,没有根据属性值从首字母去依次比较排序。 所以这次,我找个空闲时间,重新写了方法:对二维数据进行排序,支持属性值为中文,英文,数字,以及特殊字符(当然特殊字符会跳过排序)
//封装排序函数(仅适用于二维数组根据某个属性值排序)property:属性键名 falg: 顺序/倒叙; as:
//例如二维数组为[{Name: 'tainkong'},{Name: 'tainting'}];
stringSort(property, falg){
return function(a,b){
let up_val = null;
let up_down = null;
//加这个for循环,表示最多可判断50个字符; (这里假设二维数组某个属性的值的长度最大比较到第50位)
for(let i =0; i< 50; i++){
let value1 = null; let value2 = null;
let pattern = new RegExp("[\u4E00-\u9FA5]+"); //检测是否是中文
let pattern2 = new RegExp("[A-Za-z]+"); //是否是英文
let pattern3 = new RegExp("[0-9]+"); //是否是数字
let chiness_f1 = '', chiness_f2 = ''; //标记是否为中文
//找到两者的第一个不同的字符 (就是根据第一个不同的字符去比较大小,进而进行排序) 对应上面的数组应为: k 和 t
if(a[property][i] !== b[property][i]){
//进行字符的判断: 由于中文的比较 与 英文和数字的比较方式不同,所以对中文进行单独标记
if(pattern.test(a[property][i])){
chiness_f1 = 'yes';
value1 = a[property].charAt(i);
}else if(pattern2.test(a[property][i])){
value1 = a[property].charCodeAt(i); //英文转化为码数
}else if(pattern3.test(a[property][i])){
value1 = a[property][i]; //数字不需要处理
}else{
//其余类型的直接跳出循环
continue;
}
if(pattern.test(b[property][i])){
chiness_f2 = 'yes';
value2 = b[property].charAt(i);
}else if(pattern2.test(b[property][i])){
value2 = b[property].charCodeAt(i);
}else if(pattern3.test(b[property][i])){
value2 = b[property][i];
}else{
//其余类型的直接跳出循环
continue;
}
if(chiness_f1 == 'yes' && chiness_f2 == 'yes'){
//中文单独处理
up_val = value1.localeCompare(value2); //顺序
up_down = value2.localeCompare(value1); //倒叙
}else{
up_val = value1 - value2; //顺序
up_down = value2 - value1; //倒叙
}
break; //终止循环
}
}
if(falg == 'up'){
return up_val;
}else{
return up_down;
}
}
},
以上函数,我只是假设属性值的字符比较位只比较到第50位, 如果您另有其他需求,可以进行调整,亲测有效!有疑问请留言
调用
sortFun(name){
const sort_flag= this.sortFlag; //默认顺序排序
const dede = this.table_data.sort(this.stringSort(name, sort_flag));
},
其中,table_data 为需要排序的二维数组; name为需要依据此排序的二维数组的某个键名。