Sort array of objects by string property value Sort array of objects by string property value arrays arrays

Sort array of objects by string property value


It's easy enough to write your own comparison function:

function compare( a, b ) {  if ( a.last_nom < b.last_nom ){    return -1;  }  if ( a.last_nom > b.last_nom ){    return 1;  }  return 0;}objs.sort( compare );

Or inline (c/o Marco Demaio):

objs.sort((a,b) => (a.last_nom > b.last_nom) ? 1 : ((b.last_nom > a.last_nom) ? -1 : 0))


You can also create a dynamic sort function that sorts objects by their value that you pass:

function dynamicSort(property) {    var sortOrder = 1;    if(property[0] === "-") {        sortOrder = -1;        property = property.substr(1);    }    return function (a,b) {        /* next line works with strings and numbers,          * and you may want to customize it to your needs         */        var result = (a[property] < b[property]) ? -1 : (a[property] > b[property]) ? 1 : 0;        return result * sortOrder;    }}

So you can have an array of objects like this:

var People = [    {Name: "Name", Surname: "Surname"},    {Name:"AAA", Surname:"ZZZ"},    {Name: "Name", Surname: "AAA"}];

...and it will work when you do:

People.sort(dynamicSort("Name"));People.sort(dynamicSort("Surname"));People.sort(dynamicSort("-Surname"));

Actually this already answers the question. Below part is written because many people contacted me, complaining that it doesn't work with multiple parameters.

Multiple Parameters

You can use the function below to generate sort functions with multiple sort parameters.

function dynamicSortMultiple() {    /*     * save the arguments object as it will be overwritten     * note that arguments object is an array-like object     * consisting of the names of the properties to sort by     */    var props = arguments;    return function (obj1, obj2) {        var i = 0, result = 0, numberOfProperties = props.length;        /* try getting a different result from 0 (equal)         * as long as we have extra properties to compare         */        while(result === 0 && i < numberOfProperties) {            result = dynamicSort(props[i])(obj1, obj2);            i++;        }        return result;    }}

Which would enable you to do something like this:

People.sort(dynamicSortMultiple("Name", "-Surname"));

Subclassing Array

For the lucky among us who can use ES6, which allows extending the native objects:

class MyArray extends Array {    sortBy(...args) {        return this.sort(dynamicSortMultiple(...args));    }}

That would enable this:

MyArray.from(People).sortBy("Name", "-Surname");


In ES6/ES2015 or later you can do this way:

objs.sort((a, b) => a.last_nom.localeCompare(b.last_nom));

Prior to ES6/ES2015

objs.sort(function(a, b) {    return a.last_nom.localeCompare(b.last_nom)});