Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to sort javascript objects based on their properties, specifying the property

There are lots of answers on SO for similar questions, which all describe how to implement a custom sort function to sort an array of javascript objects.

However, I was wondering if it might be possible to implement a more abstract custom sort that would allow me to pass the name of the property of the objects on which I want it to sort. This might save me having to implement very similar functions over and over again.

So if I had an object constructor like:

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

then instead of implementing two sort functions:

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

I could have some sort of generic function such as:

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

but the custom sort seems to only take 2 arguments.

Any suggestions as to how I could do this?

Many thanks.

like image 389
Joe Avatar asked Sep 18 '11 16:09

Joe


2 Answers

You need to write a function that takes a property name and returns a comparator:

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

You would use it like this:

arr.sort(createComparator("maxSpeed"));
like image 154
SLaks Avatar answered Oct 16 '22 22:10

SLaks


sort takes a function, which can be anonymous:

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

If you really don't want this, you can define a sortObjectsOnProperty() function that return a sort callback like this:

function sortObjectsOnProperty(name) {
    return function(a, b) { return a[name] - b[name]; }
}
like image 43
Arnaud Le Blanc Avatar answered Oct 16 '22 21:10

Arnaud Le Blanc