47

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.

0

4 Answers 4

65

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

Sign up to request clarification or add additional context in comments.

3 Comments

You can find some useful answers to this topic here: Sort Javascript Object Array By Date
note: don't forget the explicit return declaration
For most recent first, shouldn't it be new Date(b.start).getTime() - new Date(a.start).getTime()
7
recent.sort(function(a,b) { return new Date(a.start).getTime() - new Date(b.start).getTime() } );

4 Comments

Subtracting Date objects apparently returns the same thing as subtracting their getTime() values, although I can't find this requirement in any specification.
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.
A bigger compatibility problem may be that parsing mm/dd/yy format is not portable.
That's a good point. Generally, if you need to be portable, the ISO date should be used.
5

ES6:

recent.sort((a,b)=> new Date(b.start).getTime()-new Date(a.start).getTime());

Comments

1

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)

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.