在JavaScript中对自定义对象的数组进行排序

3 javascript object

假设我有一个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)


Ros*_*oss 5

您可以使用优库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)