项目中遇到了要给对象数组排序的问题,这时候就不能简单的使用sort()来解决了。
在脚本之家这里找到了解决方法,代码贴在最下边了。
功能虽然靠复制粘贴实现了,还是得搞清楚原理:
首先,我们看一下JavaScript的sort()方法,这个方法其实是可以带参数的:
- 当sort()方法不带参数的时候,将按照数字,字母(字符编码)的顺序进行排序。
- 当sort()想要按照其他标准进行排序的时候,就需要传入参数。这个参数是一个比较函数。
注意:这里的比较函数应该具有两个参数a和b。其返回值如下:
- 若a小于b,在排序后的数组中a应该出现在b之前(即升序排列),则返回小于0的值
- 若a等于b,则返回0
- 若a大于b,则返回一个大于0的值
这样说比较绕,简单来理解就是:
比较函数要来比较a和b的大小,此时比较结果的3种情况要返回不同的值:
- 当a小于b的时候,返回负数则升序排列;返回正数则降序排列
- a大于b的时候返回值与其相反
- a等于b的时候,返回0
代码如下:
//比较器
function compare(propertyName) {
return function (object1, object2) {
var value1 = object1[propertyName];
var value2 = object2[propertyName];
if (value1 < value2) {
return 1;
}else if (value1 > value2) {
return -1;
}else {
return 0;
}
};
}
//使用方法
data.sort(compare("name"));
JavaScript对象根据属性值(中文)进行排序
上边是根据对象的属性值进行排序,但是有些情况下属性值是中文,比如姓名,省份。此时,结合localeCompare,可以把中文按照拼音首字母来排序。
//比较器
function compare(propertyName) {
return function (object1, object2) {
var value1 = object1[propertyName];
var value2 = object2[propertyName];
return value1.localeCompare(value2);
};
}
//按照订单order中的姓名name的值进行排序
jdata.order.sort(compare("name"));
含有英文大小写的字符串,忽略大小写按字母排序
//取得储存的CC_email_list然后分开变成数组,并且排序
var email_list = localStorage.getItem("assign_dc_email").split(";").sort(function(a,b){
return a.toLowerCase().localeCompare(b.toLowerCase());
});