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;
    }

  • 相关阅读:
    双主MySQL+keepalived高可用配置
    centos6.8服务器部署svn
    Centos6下rpm安装MySQL5.6
    CentOS6.8下部署Zabbix3.0
    python核心编程第六章练习6-15
    python核心编程第六章练习6-14
    scp 将数据从一台linux服务器复制到另一台linux服务器
    $config['base_url'] BASE_URL
    ubunt设置终端快捷键设置 及 常用快捷键
    URL 路由
  • 原文地址:https://www.cnblogs.com/ievy/p/2803575.html
Copyright © 2011-2022 走看看