1 简单说明
本文使用localeCompare方法实现了对中英文混合排序方法,共实现了两种排序方法,排序结果如下
2 代码
2.1 将中英文归类按照字典的排序方法
/* 对名字进行排序,包括中文、英文和特殊字符 */
class NameSort{
// a.localeCompare(b)的返回值
// -1: a="a", b="b";
// "中国"="zhongguo"; "郑州"="zhengzhou";
// 0: a="中国", b="中国";
// 1: a="中国", b="郑州"; "zhongguo"的第三个字母o > "zhengzhou"的第三个字母e
// -1: a="郑州", b="中国";
sort(nameArr) {
if(nameArr.length == 0){
return;
}
let enArr = "*ABCDEFGHIJKLMNOPQRSTUVWXYZ".split("");
let zhArr = [{zh:'*', prev:'*'},{zh:'阿', prev:'*'}, {zh:'八', prev:'阿'},{zh:'嚓', prev:'八'},{zh:'哒', prev:'嚓'},{zh:'妸', prev:'哒'},{zh:'发', prev:'妸'},{zh:'旮', prev:'发'},{zh:'哈', prev:'旮'},{zh:'I', prev:'哈'},{zh:'讥', prev:'哈'},{zh:'咔', prev:'讥'},{zh:'垃', prev:'咔'},{zh:'痳', prev:'垃'},{zh:'拏', prev:'痳'},{zh:'噢', prev:'拏'},{zh:'妑', prev:'噢'},{zh:'七', prev:'妑'},{zh:'呥', prev:'七'},{zh:'扨', prev:'呥'},{zh:'它', prev:'扨'},{zh:'U', prev:'它'},{zh:'V', prev:'它'}, {zh:'穵', prev:'它'},{zh:'夕', prev:'穵'},{zh:'丫', prev:'夕'},{zh:'Z', prev:'丫'}];
// 排序好的数据
let newNameArr = [];
// 中文正则
let chineseRe = new RegExp("^[\u4E00-\u9FA5]+$");
// 英文正则
let englishRe = new RegExp("^[a-zA-Z]+$");
enArr.forEach((enItem, enIndex) => {
let curr = {
en: '', //字母
data: [] //数据
};
nameArr.forEach((nameItem)=>{
let firstChar = nameItem.name[0];
// 首先过滤特殊字符
if(enIndex == 0){
// 特殊符号
if(!(chineseRe.test(firstChar) || englishRe.test(firstChar))){
curr.data.push(nameItem);
}
}else{
if(englishRe.test(firstChar)){
// 英文
if (firstChar.toUpperCase() == enItem) {
curr.data.push(nameItem);
}
}else if(chineseRe.test(firstChar)){
// 中文,注意中文中没有I、U、V拼音开头的汉字
if(enItem != "I" && enItem != "U" && enItem != "V"){
if ((zhArr[enIndex].prev).localeCompare(nameItem.name) <= 0 && (zhArr[enIndex].zh).localeCompare(nameItem.name) > 0) {
curr.data.push(nameItem);
}
}
}else if(enIndex == 0){
curr.data.push(nameItem);
}
}
});
if (curr.data.length>0) {
curr.en = enArr[enIndex];
curr.data.sort((a, b) => {
return a.name.localeCompare(b.name);
});
newNameArr.push(curr);
}
});
// 返回带有字母的列表
return newNameArr;
// return this.transfromArr(newNameArr);
}
// 删除字母,仅仅保留汉字
transfromArr(data){
if(data.length == 0){
return new Array();
}
let newData = new Array();
let startIndex = 0;
if(data[0].en == "*"){
startIndex = 1;
}
for (let i = startIndex; i < data.length; i++) {
let dataItem = data[i];
dataItem.data.forEach((dataItem)=>{
newData.push(dataItem);
});
}
// 特殊字符
if(startIndex == 1){
data[0].data.forEach((dataItem)=>{
newData.push(dataItem);
});
}
return newData;
}
}
2.2 HTML代码
<!DOCTYPE html>
<html>
<head>
<title>测试</title>
<script type="text/javascript" src="./NameSort.js"></script>
<script type="text/javascript">
let arr = [{ name: "中a国" }, { name: "a国" }, { name: "Z策略" }, { name: "d策略" }, { name: "*策略" }, { name: "-策略" }, { name: "&" }, { name: "vue" }, { name: "uindex" }, { name: "郑州球" }];
// 中英合并在一起排序
let nameSort = new NameSort();
console.log(nameSort.sort(arr));
// 简单排序
console.log(arr.sort((a, b)=>(a.name).localeCompare(b.name)));
</script>
</head>
<body>
</body>
</html>