JS实现数组按照【数字 > 字符串 >汉字拼音】排序——类似EXEL筛选

一、实现原理

localeCompare() 方法返回一个数字来指示一个参考字符串是否在排序顺序前面或之后或与给定字符串相同。

二、实现步骤

//原始数据
var a = ['欧阳鹏','欧阳鹏b','欧阳鹏a', '赵芳', '陈诚', 'a', 'b', '1', '2', '12', '300'];
1、 直接调用a.sort()方法:
>a.sort();
>["1", "12", "2", "300", "a", "b", "欧阳鹏", "欧阳鹏a", "欧阳鹏b", "赵芳", "陈诚"]
2、 调用a.sort(function(a, b){a.localeCompare(b)});
>a.sort(function(a, b){return a.localeCompare(b)})
>["1", "12", "2", "300", "陈诚", "欧阳鹏", "欧阳鹏a", "欧阳鹏b", "赵芳", "a", "b"]

说明:可以看到这个结果离预期已经很近的,但是我希望字符串"a","b"排在汉字前面

3、我们对数字,字符,和汉字分成三块来处理:数字,仅仅字符,汉字三部分来处理
function sort(a, b){
	var n = !isNaN(a - 0), n2 = !isNaN(b - 0);
	// 数字优先
	if (n && n2) {
		return a - b;
	} else if (n) {
		return -1;
	} else if (n2) {
		return 1;
	} 
	
	// 将含有汉字的使用localeCompare排序
	var e = escape(a).indexOf("%u") > -1, e2 = escape(b).indexOf("%u") > -1
	if (e && e2) {
		return a.localeCompare(b);
	} else if (e) {
		return 1;
	} else if (e2) {
		return -1;
	}
	return a.localeCompare(b);
}

结果如下:

["1", "2", "12", "300", "a", "b", "陈诚", "欧阳鹏", "欧阳鹏a", "欧阳鹏b", "赵芳"]

三、备注

  1. 使用escape来判断字符串中是否有汉字实际上并不完全准确,其他需要一个个去判断字节码太麻烦了,不过这种方式暂时可用吧;
  2. 基本数据是跑通了还没有经过更加全面的测试验证;

你可能感兴趣的:(前端开发)