zoukankan      html  css  js  c++  java
  • javascript 排序问题

    这几天在弄联系人排序,需求是中文名排在先,然后是英文,然后数字,然后特殊字符,然后姓名为空的最后显示。

    使用数组自带的sort函数,使用字符串localeCompare进行对比就完成。但是中文字符使用localeCompare排序似乎有些问题,localeCompare是按Unicode编码排序的,但是我们需要的是中文字要按照拼音排序。研究了半天,使用了这样的方法。

    将所有联系人分类:中文名-a组,英文名(字母开头)-b组,数字 开头 -c组,特殊字符-d组,空白-f组

    然后将a组的中文汉字转换出拼音,

    然后对各组使用localeCompare排序,空白组排序加在最后。

    最后完成~吼吼。。。

    localeCompare对比英文字符就不再会有问题。OK

    贴上自己的代码,保留以后用

    var data=top.Contacts.data;
    var contacts=data.contacts;  //contacts 排序数据
    if(!data.sortOrder)data.sortOrder=1;
    data.sortOrder=-data.sortOrder;
    var index=data.sortOrder;
    switch(item){
    case "name":{
    var chIndex = 0, digitIndex = 0,enIndex = 0,partIndex =0 ,sortBymobileName =[],sortByChName = [],sortByEnName =[],proteSign=[],noName=[];
    var chineseReg = /^[\u4E00-\u9FA5]+$/, englishReg = /^[A-Za-z]+$/, digitalReg = /^[0-9]+$/;
    for(var i = 0; i<contacts.length;i++){
    if(chineseReg.test(contacts[i].name.charAt(0))){ //中文开头的姓名
      sortByChName.push(contacts[i]);
    }else if(englishReg.test(contacts[i].name.charAt(0))){ //英文开头的姓名
      sortByEnName.push(contacts[i]);
    } else if(digitalReg.test(contacts[i].name.charAt(0))){ //数字开头的姓名
      sortBymobileName.push(contacts[i]);
    }else if(!contacts[i].Quanpin){ //姓名为空--历史数据中存在姓名为空
      noName.push(contacts[i]);

    }else{ //特殊字符开头的姓名
    proteSign.push(contacts[i]);
    }
    }

    sortByChName.sort(function(a,b){ return a.Quanpin.localeCompare(b.Quanpin)});
    sortByEnName.sort(function(a,b){ return a.Quanpin.localeCompare(b.Quanpin)});
    sortBymobileName.sort(function(a,b){ return a.Quanpin.localeCompare(b.Quanpin)});
    proteSign.sort(function(a,b){return a.Quanpin.localeCompare(b.Quanpin)});
    var sortedContacts = [];
    sortedContacts = sortByChName;
    sortedContacts = sortedContacts.concat(sortByEnName);
    sortedContacts = sortedContacts.concat(sortBymobileName);
    sortedContacts = sortedContacts.concat(proteSign);
    sortedContacts = index>0? sortedContacts : sortedContacts.reverse();
    top.Contacts.data.contacts = sortedContacts.concat(noName); //没有姓名的永远排最后

    break;
    }

  • 相关阅读:
    git 无法提交到远程服务器【转载】
    vscode 常用快捷键
    mongodb nodejs一个有自增id的功能
    C++ lambda表达式与函数对象
    TypeScript的async, await, promise,多参数的调用比较(第2篇)
    了解TypeScript的async,await,promise(第1篇)
    TyepScript判断一个变量是null, or undefined
    MongoClient 对 Mongodb的 增删改查 操作
    TypeScript第一个Promise程序
    C++基类的继承和多态
  • 原文地址:https://www.cnblogs.com/ievy/p/2803575.html
Copyright © 2011-2022 走看看