有这样一个需求是对一个列表中的一个中文字段进行排序,包括升序和降序。
于是我就百度一下,结果是找到了,但大多数都是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"]);
}