特殊字符,英文,中文排序

参考文章: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 }

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

posted @ 2019-03-26 15:40  he伟_li  阅读(1089)  评论(0编辑  收藏  举报