于是我就百度一下,结果是找到了,但大多数都是Extjs。
第一,我不想因为就是想要个中文排序就要引入Extjs库,extjs太庞大了,并且它还不是免费的。
第二,需求中的要排序的中文字段是有限,也就是字段是确定的
由于这两点,我就想自己写一个方法来进行中文排序。
在js中,排序的方法,也就是Array中的sort方法。
没错就用它了。
以下的斜体字是摘录自js的语言参考手册。
sort 方法
返回一个元素已经进行了排序的 Array 对象。
arrayobj.sort(sortfunction)
参数
arrayObj
必选项。任意 Array 对象。
sortFunction
可选项。是用来确定元素顺序的函数的名称。如果这个参数被省略,那么元素将按照 ASCII 字符顺序进行升序排列。
说明
sort 方法将 Array 对象进行适当的排序;在执行过程中并不会创建新的 Array 对象。
如果为 sortfunction 参数提供了一个函数,那么该函数必须返回下列值之一:
- 负值,如果所传递的第一个参数比第二个参数小。
- 零,如果两个参数相等。
- 正值,如果第一个参数比第二个参数大。
以下举一些例子,来说明以下sort方法使用。
对数字数组排序
输出是1,2,3,4,5,6。var o = [6,2,4,5,3,1];
var l = o.sort();①
document.write(l);
可以看得出,sort方法默认是升序。其实①中的语句等同于:
而如何将排序变成降序,其实很简单是把①中的语句改成:var l = o.sort(function(a,b){return a - b});
var l = o.sort(function(b,a){return a - b});sort方法,不止对数字能排序,对于英文,和中文都能排序,例如:
输出应该是,a,b,c,d,e,f;var o = [d,c,a,e,f,b];
var l = o.sort();
document.write(l);
输出的结果是: 东莞,中山,佛山,广州,深圳,顺德 ;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的值,改成“ 东佛广河深顺中”就能,把河源排序了。
其实这个例子比较粗糙的,因为只是比较第一个字,其实可以当两个词的第一个字相同的话,可以比较第二个字,用递归的算法和闭包可以现实比较完全部字,这在乎你有没有必要全部比较。