var items = [
{name: "linc", age: 28, num: 12345},
{name: "linc", age: 28, num: 1234},
{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}
];
// ascending 升序 descending 降序
(function _default() {
items.sort(function (a, b) {
return SortByProps(a, b, ['name', 'age', 'num'], {name: 'ascending', age: 'descending'});
});
console.log(items)
})();
function SortByProps(item1, item2, attr, obj) {
/**
* @type {Array}
* attr: Array 按照数组的顺序排序
* obj: { attr[index]: 'ascending'/ 'descending' } ascending '升序' descending '降序'
*/
var props = [];
if (obj) {
props.push(obj)
}
var cps = []; // 存储排序属性比较结果。
// 如果未指定排序属性(即obj不存在),则按照全属性升序排序。
// 记录下两个排序项按照各个排序属性进行比较得到的结果
var asc = true; // 记录升序还是降序,升序 true 降序 false
if (props.length < 1) {
for (var p of attr) {
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 of attr) {
prop[o] ? asc = (prop[o] === "ascending") : asc = true;
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; // 小于时跳出循环。
}
}
}
}
return cps[cps.length - 1]
}