js 混合排序(类似中文手机操作系统中的通讯录排序)
在阳光明媚最适合打盹的下午, 特意静音的手机竟然动起来了, 你没看错, 它震动了....
上帝(顾客)来电, "报表查询系统左侧树状菜单中设备的中文名称不能排序", 要增加排序功能....bu la...bu la... , 增加xxx ,增加xxx
开始干吧! 原谅我上面那么多废话...
华丽的分割线
直接上代码
要排序的数据如下图:

下面是代码(废话):
// 数字字母中文混合排序
function arrSortMinToMax(a, b) {
// 判断是否为数字开始; 为啥要判断?看上图源数据
if (/^\d+/.test(a.Name) && /^\d+/.test(b.Name)) {
// 提取起始数字, 然后比较返回
return /^\d+/.exec(a.Name) - /^\d+/.exec(b.Name);
// 如包含中文, 按照中文拼音排序
} else if (isChinese(a.Name) && isChinese(b.Name)) {
// 按照中文拼音, 比较字符串
return a.Name.localeCompare(b.Name, 'zh-CN')
} else {
// 排序数字和字母
return a.Name.localeCompare(b.Name, 'en');
}
} // 检测是否为中文,true表示是中文,false表示非中文
function isChinese(str) {
// 中文万国码正则
if (/[\u4E00-\u9FCC\u3400-\u4DB5\uFA0E\uFA0F\uFA11\uFA13\uFA14\uFA1F\uFA21\uFA23\uFA24\uFA27-\uFA29]|[\ud840-\ud868][\udc00-\udfff]|\ud869[\udc00-\uded6\udf00-\udfff]|[\ud86a-\ud86c][\udc00-\udfff]|\ud86d[\udc00-\udf34\udf40-\udfff]|\ud86e[\udc00-\udc1d]/.test(str)) {
return true;
} else {
return false;
}
}
排序结果如下图:

搞定收工!
没错, 实现这个排序实际用了不到20行代码, 开始也当回事, 觉得可以分分钟搞定(不擅长前端的猿), 结果折腾了大半天....

其实排序关键在中文拼音这块, 还有就是"数字开头"的字符串要优先按照前面的数字排序. 好了, 为了实现参阅了以下资料, 有兴趣再优化的同学可以参考以下连接:
http://www.unicode.org/charts/
http://www.unicode.org/reports/tr38/#BlockListing
String.prototype.localeCompare() 详解
js 混合排序(类似中文手机操作系统中的通讯录排序)的更多相关文章
- 在英文版操作系统中安装的MS SQL server,中文字段无法匹配
在英文版的操作系统中安装的MS SQL server,会出现中文字段无法被匹配到.其原因在于英文环境下安装的MS SQL server的排序规则不包括中文. 所以解决办法就是更改MS SQL serv ...
- JS判断是否是微信页面,判断手机操作系统(ios或android)并跳转到不同下载页面
JS判断客户端是否是iOS或者Android 参考:http://caibaojian.com/browser-ios-or-android.html function is_weixin() { v ...
- js按照特定的中文字进行排序的方法
之前遇到过按照中文字符排序的需求很顺利的解决了,这次是按照特定的中文字进行排序,比如按照保守型,稳健型,平衡型,成长型,进取型进行排序. 可以使用localeCompare() 方法来实现中文按照拼音 ...
- 解决windows 10英文版操作系统中VS2017控制台程序打印中文乱码问题
当您在windows 10英文版的操作系统中运行Vs2017控制台应用程序时,程序可能无法正常显示中文,中文都变成了乱码.这是由于大部分中文程序所使用的文字编码与Windows 英文系统的文字编码不同 ...
- java算法面试题:从类似如下的文本文件中读取出所有的姓名,并打印出重复的姓名和重复的次数,并按重复次数排序 ;读取docx 读取doc 使用poi 相关jar包提集提供下载
从类似如下的文本文件中读取出所有的姓名,并打印出重复的姓名和重复的次数,并按重复次数排序 1,张三,28 2,李四,35 3,张三,28 4,王五,35 5,张三,28 6,李四,35 7,赵六,28 ...
- JS中算法之排序算法
1.基本排序算法 1.1.冒泡排序 它是最慢的排序算法之一. 1.不断比较相邻的两个元素,如果前一个比后一个大,则交换位置. 2.当比较完第一轮的时候最后一个元素应该是最大的一个. 3.按照步骤一的方 ...
- Js数组对象的属性值升序排序,并指定数组中的某个对象移动到数组的最前面
需求整理: 本篇文章主要实现的是将一个数组的中对象的属性值通过升序的方式排序,然后能够让程序可以指定对应的数组对象移动到程序的最前面. 数组如下所示: var arrayData= [{name: & ...
- 百度前端学院js课堂作业合集+分析(更新中...)
第一课:简陋的登录框 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...
- c#Winform程序调用app.config文件配置数据库连接字符串 SQL Server文章目录 浅谈SQL Server中统计对于查询的影响 有关索引的DMV SQL Server中的执行引擎入门 【译】表变量和临时表的比较 对于表列数据类型选择的一点思考 SQL Server复制入门(一)----复制简介 操作系统中的进程与线程
c#Winform程序调用app.config文件配置数据库连接字符串 你新建winform项目的时候,会有一个app.config的配置文件,写在里面的<connectionStrings n ...
随机推荐
- Mac 打造开发工作环境
近日公司配的dell笔记本越来越难担重任(主要是CPU太差,本人是Java开发,IDE一编译CPU就100%),于是狠下心入手了一台常规顶配Macbook Pro,现记录新本本的调教过程. Homeb ...
- ID转名称到手方案01
> 好久没有写技术文章了,那就重新捡起来,从今天开始,分享这段时间的收获吧 ------------ > ## 其实很多时候,我们只需要鱼,而不是渔,呐,给你鱼. ### 这次的分享主题是 ...
- 逆向破解之160个CrackMe —— 017
CrackMe —— 017 160 CrackMe 是比较适合新手学习逆向破解的CrackMe的一个集合一共160个待逆向破解的程序 CrackMe:它们都是一些公开给别人尝试破解的小程序,制作 c ...
- 史上最全面的SignalR系列教程-6、SignalR 实现聊天室
1.概述 通过前面几篇文章对SignalR的详细介绍.我们知道Asp.net SignalR是微软为实现实时通信的一个类库.一般情况下,SignalR会使用JavaScript的长轮询(long po ...
- FIS 插件机制
FIS 插件机制 author: @TiffanysBear 当我们使用 FIS 插件的时候,有没有想过自己也开发一个基于 FIS 的插件,参与 FIS 打包编译的整个流程:那么问题就来了: FIS ...
- TensorFlow Slim 的常用操作
https://blog.csdn.net/mzpmzk/article/details/81706379
- javaio字节流复制文件夹
public class Copy1 { public static void main(String[] args) throws IOException { File src=new File(& ...
- Codeforces 246C
题意略. 思路: 我们将数组中的数字从大到小排列,分别考虑取前0 + 1,1 + 1,2 + 1.....个的情况. 所谓i + 1的意思是,取前i个的时候,同时取第[i + 1],[i + 2],. ...
- MSIL实用指南-this的生成
C#关键字是非静态方法体内部,用Ldarg_0指代this例子ilGenerator.Emit(OpCodes.Ldarg_0);
- 微擎 人人商城 导出excel表分析
在 数据处理上 ,有很多时候需要导出excel表 来当报表, 等 , php 人人商城导出报表过程简单分析 在导出时候发现 ca('statistics.order.export'); 出于好奇 ...