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

使用数组自带的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;
}

posted on 2012-12-05 17:28  tianqing52  阅读(317)  评论(0编辑  收藏  举报