二维数组根据某个属性值进行排序(根据属性值的首字母依次比较排序)

最近做项目,需要对表格行排序,表格数据是个二维数组。 一般情况的根据二维数组某个属性值进行排序,都是比较首字母的,没有根据属性值从首字母去依次比较排序。 所以这次,我找个空闲时间,重新写了方法:对二维数据进行排序,支持属性值为中文,英文,数字,以及特殊字符(当然特殊字符会跳过排序)

//封装排序函数(仅适用于二维数组根据某个属性值排序)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为需要依据此排序的二维数组的某个键名。

你可能感兴趣的:(二维数组根据某个属性值进行排序(根据属性值的首字母依次比较排序))