43

I am trying to sort an array of objects with each object containing:

var recent = [{id: "123",age :12,start: "10/17/13 13:07"} , {id: "13",age :62,start: "07/30/13 16:30"}];

Date format is: mm/dd/yy hh:mm.

I want to sort in order of date with the most recent first. If date is same it should be sorted by their time parts.

I tried out the below sort() function, but it is not working:

recent.sort(function(a,b))
{
    a = new Date(a.start);
    b = new Date(b.start);
    return a-b;
});

Also how should I iterate over the objects for sorting? Something like:

for (var i = 0; i < recent.length; i++)
    {
        recent[i].start.sort(function (a, b)
        {
            a = new Date(a.start);
            b = new Date(b.start);
            return a-b; 
        } );
    }

There can be any number of objects in the array.

Alexander Abakumov
  • 10,817
  • 10
  • 71
  • 111
Anthea
  • 445
  • 1
  • 4
  • 5

4 Answers4

61

As has been pointed out in the comments, the definition of recent isn't correct javascript.

But assuming the dates are strings:

var recent = [
    {id: 123,age :12,start: "10/17/13 13:07"}, 
    {id: 13,age :62,start: "07/30/13 16:30"}
];

then sort like this:

recent.sort(function(a,b) { 
    return new Date(a.start).getTime() - new Date(b.start).getTime() 
});

More details on sort function from W3Schools

Chris Charles
  • 4,266
  • 15
  • 29
  • 1
    You can find some useful answers to this topic here: **[Sort Javascript Object Array By Date](http://stackoverflow.com/a/26759127/2247494)** – jherax Nov 05 '14 at 15:35
  • 2
    **note**: don't forget the explicit `return` declaration – pruett Aug 13 '15 at 15:51
5
recent.sort(function(a,b) { return new Date(a.start).getTime() - new Date(b.start).getTime() } );
Tom Bowers
  • 4,090
  • 2
  • 23
  • 38
  • Subtracting Date objects apparently returns the same thing as subtracting their `getTime()` values, although I can't find this requirement in any specification. – Barmar Oct 17 '13 at 15:31
  • Yes, I've noticed that, although getTime() will always be consistent, and since the OP wants the time component to explicitly be used when sorting, it makes sense to be specific. – Tom Bowers Oct 17 '13 at 15:36
  • A bigger compatibility problem may be that parsing `mm/dd/yy` format is not portable. – Barmar Oct 17 '13 at 15:37
  • That's a good point. Generally, if you need to be portable, the ISO date should be used. – Tom Bowers Oct 17 '13 at 15:39
0

This function allows you to create a comparator that will walk a path to the key you would like to compare on:

function createDateComparator ( path = [] , comparator = (a, b) => a.getTime() - b.getTime()) {
  return (a, b) => {
    let _a = a
    let _b = b
    for(let key of path) {
      _a = _a[key]
      _b = _b[key]
    }
    return comparator(_a, _b)
  }
}


const input = (
  [ { foo: new Date(2017, 0, 1) }
  , { foo: new Date(2018, 0, 1) }
  , { foo: new Date(2016, 0, 1) }
  ]
)

const result = input.sort(createDateComparator([ 'foo' ]))

console.info(result)
cchamberlain
  • 14,693
  • 6
  • 52
  • 67
0

ES6:

recent.sort((a,b)=> new Date(b.start).getTime()-new Date(a.start).getTime());
stayingcool
  • 924
  • 11
  • 19