假设我有一个Employee对象数组:
var Employee = function(fname, age) {
this.fname = fname;
this.age = age;
}
var employees = [
new Employee("Jack", "32"),
new Employee("Dave", "31"),
new Employee("Rick", "35"),
new Employee("Anna", "33")
];
Run Code Online (Sandbox Code Playgroud)
此时,employees.sort()没有任何意义,因为解释器不知道如何对这些自定义对象进行排序.所以我传递了我的自定义排序功能.
employees.sort(function(employee1, employee2){
return employee1.age > employee2.age;
});
Run Code Online (Sandbox Code Playgroud)
现在employees.sort()花花公子.
但是,如果我还想控制要排序的字段,在运行时以某种方式传递它,该怎么办?我可以这样做吗?
employees.sort(function(employee1, employee2, on){
if(on === 'age') {
return employee1.age > employee2.age;
}
return employee1.fname > employee2.fname;
});
Run Code Online (Sandbox Code Playgroud)
我不能让它工作,所以建议?也许基于设计模式的重构?
Ale*_*lov 13
function getSortFunction(fieldName) {
return function(employee1, employee2) {
return employee1[fieldName] > employee2[fieldName];
}
}
employees.sort(getSortFunction("myField"));
Run Code Online (Sandbox Code Playgroud)
另一种解决方案是使用Function.prototype.bind,如果你不害怕它:)
function mySorter(fieldName, employee1, employee2) {
return employee1[fieldName] > employee2[fieldName];
}
employees.sort(mySorter.bind(null, "myField"));
Run Code Online (Sandbox Code Playgroud)
您可以使用优库underscore.js " sortBy方法.
例如:
var arr = [
{ name:"a", age:100 },
{ name:"b", age:90 },
{ name:"c", age:80 },
{ name:"d", age:70 }
];
var sorted = _.sortBy(arr, "age");
console.log( sorted );
Run Code Online (Sandbox Code Playgroud)
或者在你的情况下:
_.sortBy(employees, "age");
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4672 次 |
| 最近记录: |