js实现中英文合并排序

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>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值