zoukankan      html  css  js  c++  java
  • 特殊字符,英文,中文排序

    参考文章:https://www.jianshu.com/p/2d23bad290dd

    实现顺序: 特殊字符,A-Z: 字母 + 中文

    实现逻辑: 

      定义展示letters,"*ABCDEFGHJKLMNOPQRSTWXYZ"

      定义中文、特殊字符 正则匹配

      每次循环检测是否满足当前的letter, 检测中文,检测英文,最后sort 特殊函数,重新排序英文和中文。

    实现代码:

     1 /*
     2  * 判断给入的参数中是否是否中文
     3  * 包含中文返回"true"
     4  * 不包含中文返回"false"
     5  */
     6 function isIncludeChinese(obj) {
     7   var filter = /[u4E00-u9FA5]|[uFE30-uFFA0]/gi;
     8   if (!filter.exec(obj)) {
     9     return false;
    10   } else {
    11     return true;
    12   }
    13 }
    14 
    15 function checkLetters(value) {
    16   var Regx = /^[A-Za-z]*$/;
    17   if (Regx.test(value)) {
    18     return true;
    19   }
    20   else {
    21     return false;
    22   }
    23 }
    24 
    25 function teseCompareFunc (param1, param2) {
    26   let username1 = param1.alias || param1.username || param1.group_name || param1.user_group_name || param1.name || 'username';
    27   let username2 = param2.alias || param2.username || param2.group_name || param2.user_group_name || param2.name || 'username';
    28   if (checkLetters(username1[0]) && checkLetters(username2[0])) {
    29     return username1 > username2
    30   }
    31   if (checkLetters(username1[0]) && isIncludeChinese(username2[0])) {
    32     return -1
    33   }
    34   if (checkLetters(username2[0]) && isIncludeChinese(username1[0])) {
    35     return 1
    36   }
    37   if (isIncludeChinese(username1[0]) && isIncludeChinese(username2[0])) {
    38     return username1.localeCompare(username2, 'zh');
    39   }
    40   return username1.localeCompare(username2);
    41 }
    42 
    43 function testSort(arr) {
    44   var letters = "*ABCDEFGHJKLMNOPQRSTWXYZ".split("");
    45   var zh = "阿八嚓哒妸发旮哈讥咔垃痳拏噢妑七呥扨它穵夕丫帀".split("");
    46   var segs = []; // save data.
    47   var res = {};
    48   let curr;
    49   var re = /[^u4e00-u9fa5]/; // chinese reg.
    50   var pattern = new RegExp("[`\-~!@#$^&*()=|{}':;',\[\].<>《》/?~!@#¥……&*()——|{}【】‘;:”“'。,、?12345678990]"); // special characters.
    51 
    52   letters.filter((items, i) => {
    53     curr = {
    54       initial: '', // letter
    55       data: [], // data.
    56     };
    57     arr.map((item) => {
    58       let username = item.alias || item.username || item.group_name || item.user_group_name || item.name || 'username';
    59       // special characters.
    60       if (pattern.test(username[0])) {
    61         if ((!zh[i - 1] || zh[i - 1].localeCompare(username) <= 0) && username.localeCompare(zh[i]) == -1) {
    62           curr.data.push(item);
    63         }
    64       }
    65       // check first letter is chinese.
    66       if (re.test(username[0])) {
    67         // English.
    68         if (username[0].toUpperCase() == items) {
    69           curr.data.push(item);
    70         }
    71       } else {
    72         // Chinese.
    73         if ((!zh[i - 1] || zh[i - 1].localeCompare(username) <= 0) && username.localeCompare(zh[i]) == -1) {
    74           curr.data.push(item);
    75         }
    76       }
    77 
    78     })
    79 
    80     if (curr.data.length) {
    81       curr.initial = letters[i]
    82       curr.data.sort(teseCompareFunc);
    83       segs.push(curr);
    84     }
    85   })
    86   res.segs = Array.from(new Set(segs)) //去重
    87   // console.log(res);
    88   res.sortArr = []
    89   res.segs.forEach((item, index) => {
    90     res.sortArr.push.apply(res.sortArr, item.data)
    91   })
    92   return res.sortArr;
    93 }

    缺陷: 由于每次都对所有数据循环,对于大数据量排序时,会出现性能问题。

  • 相关阅读:
    【备忘录】Sublime Text编辑器如何在选中的多行行首增加字符串
    微信卡券领取页面提示签名错误,微信卡券JSAPI签名校验工具对比签名一模一样,cardExt扩展字段有问题
    程序运行时动态生成缓存时存在的问题
    golang的beego框架开发时出现的问题纪录
    【备忘录】CentOS服务器mysql忘记root密码恢复
    试玩swoole扩展 第一天
    spring 定时任务执行2次
    JVM CUP占用率过高排除方法,windows环境
    spring cloud 服务A调用服务B自定义token消失,记录
    java.sql.SQLException: Value '0000-00-00' can not be represented as java.sql.Timestamp
  • 原文地址:https://www.cnblogs.com/lhwblog/p/10600567.html
Copyright © 2011-2022 走看看