如何根据属性对JavaScript对象进行排序,指定属性

5

在SO上有很多类似问题的答案,它们都描述了如何实现自定义排序函数来对JavaScript对象数组进行排序。

然而,我想知道是否可能实现一种更抽象的自定义排序,以允许我传递我想要按其排序的对象属性的名称。这可能会使我避免反复实现非常相似的函数。

所以如果我有一个像这样的对象构造器:

function Car(mph, cc) {
    this.maxSpeed = mph;
    this.engineSize = cc;
}

那么,不用实现两个排序函数:

function sortCarsOnMaxSpeed(a, b) { return a.maxSpeed - b.maxSpeed; }
function sortCarsOnEngineSize(a, b) { return a.engineSize - b.engineSize; }

我可以创建一个通用函数,例如:

我可以创建一个类似这样的通用函数:

function sortObjectsOnProperty(a, b, property) {
    return a[property] - b[property];
}

但似乎自定义排序只接受两个参数。有什么建议可以解决这个问题吗?
非常感谢。
2个回答

8
您需要编写一个函数,该函数接受一个属性名称并返回一个比较器:
function createComparator(property) {
    return function(a, b) {
        return a[property] - b[property];
    };
}

您可以像这样使用它:
arr.sort(createComparator("maxSpeed"));

function createComparator(property) { return function(a, b) { if (a[property] > b[property]) return 1 if (a[property] < b[property]) return -1 return 0 }; }这段代码适用于字符串比较。 - partizanos

2

sort 接受一个函数作为参数,这个函数可以是匿名函数:

sort(array, function(a, b) { return a.maxSpeed - b.maxSpeed; });

如果你真的不想使用这个方法,你可以定义一个sortObjectsOnProperty()函数来返回一个排序回调函数,像这样:
function sortObjectsOnProperty(name) {
    return function(a, b) { return a[name] - b[name]; }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接