Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to sort an object array by date property?

Say I have an array of a few objects:

var array = [{id: 1, date: Mar 12 2012 10:00:00 AM}, {id: 2, date: Mar 8 2012 08:00:00 AM}]; 

How can I sort this array by the date element in order from the date closest to the current date and time down? Keep in mind that the array may have many objects, but for the sake of simplicity I used 2.

Would I use the sort function and a custom comparator?

like image 342
ryandlf Avatar asked Apr 12 '12 12:04

ryandlf


People also ask

How do you sort an array of objects based on date?

To sort an array of objects by date property: Call the sort() method on the array. Subtract the date in the second object from the date in the first. Return the result.

How do I sort an array in OBJ?

To sort an array of objects, you use the sort() method and provide a comparison function that determines the order of objects.

How do you order by date?

Here's how to sort unsorted dates: Drag down the column to select the dates you want to sort. Click Home tab > arrow under Sort & Filter, and then click Sort Oldest to Newest, or Sort Newest to Oldest.

How do I sort a date in TypeScript?

To sort an array of objects by date in TypeScript: Call the sort() method on the array, passing it a function. The function will be called with 2 objects from the array. Subtract the timestamp of the date in the second object from the timestamp of the date in the first.


1 Answers

Simplest Answer

array.sort(function(a,b){   // Turn your strings into dates, and then subtract them   // to get a value that is either negative, positive, or zero.   return new Date(b.date) - new Date(a.date); }); 

More Generic Answer

array.sort(function(o1,o2){   if (sort_o1_before_o2)    return -1;   else if(sort_o1_after_o2) return  1;   else                      return  0; }); 

Or more tersely:

array.sort(function(o1,o2){   return sort_o1_before_o2 ? -1 : sort_o1_after_o2 ? 1 : 0; }); 

Generic, Powerful Answer

Define a custom non-enumerable sortBy function using a Schwartzian transform on all arrays :

(function(){   if (typeof Object.defineProperty === 'function'){     try{Object.defineProperty(Array.prototype,'sortBy',{value:sb}); }catch(e){}   }   if (!Array.prototype.sortBy) Array.prototype.sortBy = sb;    function sb(f){     for (var i=this.length;i;){       var o = this[--i];       this[i] = [].concat(f.call(o,o,i),o);     }     this.sort(function(a,b){       for (var i=0,len=a.length;i<len;++i){         if (a[i]!=b[i]) return a[i]<b[i]?-1:1;       }       return 0;     });     for (var i=this.length;i;){       this[--i]=this[i][this[i].length-1];     }     return this;   } })(); 

Use it like so:

array.sortBy(function(o){ return o.date }); 

If your date is not directly comparable, make a comparable date out of it, e.g.

array.sortBy(function(o){ return new Date( o.date ) }); 

You can also use this to sort by multiple criteria if you return an array of values:

// Sort by date, then score (reversed), then name array.sortBy(function(o){ return [ o.date, -o.score, o.name ] }; 

See http://phrogz.net/JS/Array.prototype.sortBy.js for more details.

like image 64
Phrogz Avatar answered Sep 26 '22 02:09

Phrogz