工作中遇到js数组排序问题,数组中存储的都是对象,于是就百度了下,利用别人的代码进行修改,最终完成可以倒序、反序,可以进行多维度排序的功能
源码如下:
/**
* js数组排序 支持数字和字符串
* @param params
* @param arrObj obj 必填 数组对象
* @param keyName string 必填 要排序的属性名称
* @param type int 选填 默认type:0 正顺 type:1反顺
*/
function arrItemSort(arrObj,keyName,type) {
//这里如果 直接等于arrObj,相当于只是对对象的引用,改变排序会同时影响原有对象的排序,而通过arrObj.slice(0),
//表示把对象复制给另一个对象,两者间互不影响
var tempArrObj = arrObj.slice(0);
var compare = function (keyName,type) {
return function (obj1, obj2) {
var val1 = obj1[keyName];
var val2 = obj2[keyName];
if (!isNaN(Number(val1)) && !isNaN(Number(val2))) {
val1 = Number(val1);
val2 = Number(val2);
}
//如果值为空的,放在最后
if (val1 == null && val2 == null) {
return 0;
} else if (val1 == null && val2!= null ) {
return (type==1 ? -1 : 1);
} else if (val2 == null && val1!= null ) {
return (type==1 ? 1 : -1);
}
//排序
if (val1 < val2) {
return (type==1 ? 1 : -1);
} else if (val1 > val2) {
return (type==1 ? -1 : 1);;
} else {
return 0;
}
}
}
return tempArrObj.sort(compare(keyName,type));
}
使用示例:
var temp = [
{"name":"zjf","score":50,"age":10},
{"name":"lyy","score":90,"age":5},
{"name":"zzx","score":90,"age":12}
];
//根据age排序
var temp1 = arrItemSort(temp,"age",1);
console.log(temp1);
多维度排序,先进行年龄的排序,再进行分数的反序:
//根据score排序,score相同时根据age排序
var temp2 = arrItemSort(arrItemSort(temp,"age",1),"score",1);
console.log(temp2);
来源:
jsfun.cn