5

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.

2 Answers 2

8

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"));
Sign up to request clarification or add additional context in comments.

1 Comment

function createComparator(property) { return function(a, b) { if (a[property] > b[property]) return 1 if (a[property] < b[property]) return -1 return 0 }; } This works for string comparison to
2

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]; }
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.