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

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.