javascript - Sort array of objects by string property value

ID : 131

viewed : 83

Tags : javascriptarrayssortingcomparisonjavascript

Top 5 Answer for javascript - Sort array of objects by string property value

vote vote

90

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)) 
vote vote

80

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"); 
vote vote

76

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) }); 
vote vote

66

underscore.js

use underscore, its small and awesome...

sortBy_.sortBy(list, iterator, [context]) Returns a sorted copy of list, ranked in ascending order by the results of running each value through iterator. Iterator may also be the string name of the property to sort by (eg. length).

var objs = [    { first_nom: 'Lazslo',last_nom: 'Jamf' },   { first_nom: 'Pig', last_nom: 'Bodine'  },   { first_nom: 'Pirate', last_nom: 'Prentice' } ];  var sortedObjs = _.sortBy( objs, 'first_nom' ); 
vote vote

50

If you have duplicate last names you might sort those by first name-

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

Top 3 video Explaining javascript - Sort array of objects by string property value

Related QUESTION?