您也可以创建一个动态排序函数,通过传递的值对对象进行排序:
function dynamicSort(property) {
var sortOrder = 1;
if(property[0] === "-") {
sortOrder = -1;
property = property.substr(1);
}
return function (a,b) {
var result = (a[property] < b[property]) ? -1 : (a[property] > b[property]) ? 1 : 0;
return result * sortOrder;
}
}
所以你可以拥有这样的对象数组:
var People = [
{Name: "Name", Surname: "Surname"},
{Name:"AAA", Surname:"ZZZ"},
{Name: "Name", Surname: "AAA"}
];
当你执行以下操作时,它将起作用:
People.sort(dynamicSort("Name"));
People.sort(dynamicSort("Surname"));
People.sort(dynamicSort("-Surname"));
实际上,这已经回答了问题。下面的部分是由于许多人联系我,抱怨它无法处理多个参数而写的。
多个参数
您可以使用以下函数生成具有多个排序参数的排序函数。
function dynamicSortMultiple() {
var props = arguments;
return function (obj1, obj2) {
var i = 0, result = 0, numberOfProperties = props.length;
while(result === 0 && i < numberOfProperties) {
result = dynamicSort(props[i])(obj1, obj2);
i++;
}
return result;
}
}
这将使您能够做出类似于以下的操作:
People.sort(dynamicSortMultiple("Name", "-Surname"))
子类化Array
对于那些可以使用ES6的幸运儿来说,可以扩展原生对象:
class MyArray extends Array {
sortBy(...args) {
return this.sort(dynamicSortMultiple(...args));
}
}
那将实现这样的功能:
MyArray.from(People).sortBy("Name", "-Surname")