现在的位置: 首页 > 综合 > 正文

js 中文排序

2018年05月07日 ⁄ 综合 ⁄ 共 2237字 ⁄ 字号 评论关闭

有这样一个需求是对一个列表中的一个中文字段进行排序,包括升序和降序。
于是我就百度一下,结果是找到了,但大多数都是Extjs。
第一,我不想因为就是想要个中文排序就要引入Extjs库,extjs太庞大了,并且它还不是免费的。
第二,需求中的要排序的中文字段是有限,也就是字段是确定的
由于这两点,我就想自己写一个方法来进行中文排序。
在js中,排序的方法,也就是Array中的sort方法。
没错就用它了。

以下的斜体字是摘录自js的语言参考手册。


sort 方法

返回一个元素已经进行了排序的 Array 对象。

arrayobj.sort(sortfunction)

参数

arrayObj

必选项。任意 Array 对象。

sortFunction

可选项。是用来确定元素顺序的函数的名称。如果这个参数被省略,那么元素将按照 ASCII 字符顺序进行升序排列。

说明

sort 方法将 Array 对象进行适当的排序;在执行过程中并不会创建新的 Array 对象。

如果为 sortfunction 参数提供了一个函数,那么该函数必须返回下列值之一:

  • 负值,如果所传递的第一个参数比第二个参数小。
  • 零,如果两个参数相等。
  • 正值,如果第一个参数比第二个参数大。


以下举一些例子,来说明以下sort方法使用。

对数字数组排序

var o = [6,2,4,5,3,1];

var l = o.sort();①

document.write(l);

输出是1,2,3,4,5,6。
可以看得出,sort方法默认是升序。其实①中的语句等同于:

var l = o.sort(function(a,b){return a - b});

而如何将排序变成降序,其实很简单是把①中的语句改成:

var l = o.sort(function(b,a){return a - b});

sort方法,不止对数字能排序,对于英文,和中文都能排序,例如:

var o = [d,c,a,e,f,b];

var l = o.sort();

document.write(l);

输出应该是,a,b,c,d,e,f;

var o = ["广州","深圳","东莞","中山","顺德","佛山"];

var l = o.sort();

document.write(l);

输出的结果是:东莞,中山,佛山,广州,深圳,顺德
这并不是我所想那样子,我想的是,东莞,佛山,广州,深圳,顺德,中山。怎么才能按照我所想排序。其实可以用对象字面量来实现。

var o = ["广州","深圳","东莞","中山","顺德","佛山"];

var compareData = { "东莞" : 1, "佛山" : 2, "广州" : 3, "深圳" : 4, "顺德" : 5, "中山" : 6 };

var l = o.sort(function(a,b){return compareData[a]- compareData[b]});

document.write(l);

这样子,输出的结果,就是:东莞,佛山,广州,深圳,顺德,中山
然而,很多时候,数组的元素不是简单的字符,或者数字,如果是一个json返回的对象怎么排序。

var o = [{id : 007, type : "广州"}, 
	 {id : 005, type : "深圳"},
	 {id : 008, type : "东莞"}, 
	 {id : 003, type : "中山"}, 
	 {id : 002, type : "深圳"}, 
	 {id : 006, type : "佛山"}];
var compareData = {
	"东莞" : 1,
	"佛山" : 2,
	"广州" : 3,
	"深圳" : 4,
	"顺德" : 5,
	"中山" : 6
};
l = o.sort(function compare(a,b){return compareData[a.type] - compareData[b.type];});
for(var i = 0; i < l.length; i++){
    document.write(l[i]["type"]);
}

通过上面两个例子,我们应该清楚明白,其实a,或者b,或者你定义的参数都是要排序的数组的元素。
明白这点,其实对于以后修改排序的compare函数其实简单得多。
然而,我对于上面的例子,还是不太满,它的扩展性比较差,如果我在中间插入“河源”的话,以后修改起来,会比较麻烦,因为,我要修改深圳,顺德,中山的值,如果多起来怎么办,这会是个很头疼的问题。于是,能不能用String对象中的indexof()结合substr()方法优化。

var o = [{id : 007, type : "广州"}, {id : 005, type : "深圳"}, {id : 008, type : "东莞"}, {id : 003, type : "中山"}, {id : 002, type : "深圳"}, {id : 006, type : "佛山"}];

var compareString = "东佛广深顺中";

var l = o.sort(function compare(a,b){

return compareString.indexOf(a.type.substr(0,1)) - compareString.indexOf(b.type.substr(0,1));

});

for(var i = 0; i < l.length; i++){

document.write(l[i]["type"]);

}

像是这样,如果我加个河源,只有把compareString的值,改成“ 东佛广河深顺中”就能,把河源排序了。

其实这个例子比较粗糙的,因为只是比较第一个字,其实可以当两个词的第一个字相同的话,可以比较第二个字,用递归的算法和闭包可以现实比较完全部字,这在乎你有没有必要全部比较。

抱歉!评论已关闭.