特殊字符,英文,中文排序
作者:互联网
参考文章: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 }
缺陷: 由于每次都对所有数据循环,对于大数据量排序时,会出现性能问题。
标签:username,username1,中文,username2,return,name,var,排序,特殊字符 来源: https://www.cnblogs.com/lhwblog/p/10600567.html