//测试数据
var items = [{
name: "linc",
age: 28,
num: 1234
}, {
name: "linc",
age: 28,
num: 12345
}, {
name: "kiki",
age: 20,
num: 12345
}, {
name: "高峰",
age: 26,
num: 123
}, {
name: "高峰",
age: 27,
num: 101
}, {
name: "高峰",
age: 26,
num: 111
}, {
name: "安迪",
age: 29,
num: 110
}, {
name: "安迪",
age: 30,
num: 110
}];
//两个字段一升一降排序
(function asc - desc() {
items.sort(function(a, b) {
return SortByProps(a, b, {
"name": "ascending",
"age": "descending"
});
});
console.log(items)
})();
//两个字段都降序排序,其他排序方向同理,也可再加字段
(function desc() {
items.sort(function(a, b) {
return SortByProps(a, b, {
"name": "descending",
"age": "descending"
});
});
console.log(items)
})();
//不定义排序方向和字段,默认都升序排列
(function
default() {
items.sort(function(a, b) {
return SortByProps(a, b);
});
console.log(items)
})();
//以下函数排序属性并未写死,可直接拿去用自定义属性
function SortByProps(item1, item2, obj) {
var props = [];
if (obj) {
props.push(obj)
}
var cps = [];
// 存储排序属性比较结果。
// 如果未指定排序属性(即obj不存在),则按照全属性升序排序。
// 记录下两个排序项按照各个排序属性进行比较得到的结果
var asc = true;
if (props.length < 1) {
for (var p in item1) {
if (item1[p] > item2[p]) {
cps.push(1);
break;
// 大于时跳出循环。
} else if (item1[p] === item2[p]) {
cps.push(0);
} else {
cps.push(-1);
break;
// 小于时跳出循环。
}
}
} else {
for (var i = 0; i < props.length; i++) {
var prop = props[i];
for (var o in prop) {
asc = prop[o] === "ascending";
if (item1[o] > item2[o]) {
cps.push(asc ? 1 : -1);
break;
// 大于时跳出循环。
} else if (item1[o] === item2[o]) {
cps.push(0);
} else {
cps.push(asc ? -1 : 1);
break;
// 小于时跳出循环。
}
}
}
}
// 根据各排序属性比较结果综合判断得出两个比较项的最终大小关系
for (var j = 0; j < cps.length; j++) {
if (cps[j] === 1 || cps[j] === -1) {
return cps[j];
}
}
return false;
}
转载自https://blog.csdn.net/zsl_955200/article/details/78796531
十分感谢这位朋友 解决了我当时困扰了很久的问题