41

I have an array of JavaScript objects. My array is defined like this:

var myObjects = [
  { id: '1', username: 'bill.jones', active: true, createdon: '03/29/2014' },
  { id: '2', username: 'woohoo', active: true, createdon: '03/28/2014' },
  { id: '3', username: 'someuser', active: true, createdon: '03/30/2014' }
];

This array is actually dynamically populated. Still, I need to sort the results by the createdon value in ascending order. To do that, I'm trying to use lodash. The createdon value represents a date. Currently, I'm trying the following:

//  ORDER BY createdOn
myObjects.sort(function (a, b) {
  var date1 = new Date(a['createdon']);
  var date2 = new Date(b['createdon']);
  return date1 < date2;
});

_.forEach(myObjects, function(result) {
  console.log(result);
});

Unfortunately, myObjects is still not sorted after I run this function. What am I doing wrong?

Thank you!

1
  • 1
    try return date1 - date2; Commented Jul 3, 2014 at 18:34

2 Answers 2

78

I just went through lodash doc, and perhaps you could try sortBy

Try it: http://jsfiddle.net/3Wza8/

var myObjects = [
    { id: '1', username: 'bill.jones', active: true, createdon: new Date('03/29/2014') },
    { id: '2', username: 'woohoo', active: true, createdon: new Date('03/28/2014') },
    { id: '3', username: 'someuser', active: true, createdon: new Date('03/30/2014') }
];

myObjects = _.sortBy(myObjects, 'createdon');

_.forEach(myObjects, function (result) {
    console.log(result);
});

EDIT: as Cookie Monster pointed out, it's important that your createdon field is a Date, and not a string.

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

5 Comments

You're sorting by the string value, which can fail. jsfiddle.net/3Wza8/2 You'll need to convert to dates first.
Well now you're changing the data structure. You should provide a solution that works for the actual situation presented.
I see your point, but given the question's context information, I think this is a potential solution for OP. Thanks though, I will keep that in mind.
It would work as a string if the dates are in a format like YYYYMMDD where a chronological sort = a string sort
For me, I needed desc order, so I used _.orderBy(arrOfObjs, 'sort_key', 'desc'). This method is pretty powerful, you should check out the docs on it.
2

The problem is that sort expects a function which returns -1, 0 or 1. Your function only returns 0 and 1.

This slight change should fix it:

myObjects.sort(function (a, b) {
  var date1 = new Date(a['createdon']);
  var date2 = new Date(b['createdon']);
  return date1 - date2;
});

7 Comments

Why not just return date1 - date2;?
I was under the assumption that sort expected -1, 0 or 1
It just requires negative/positive numbers or 0. But the return results between the same two items should always be the same.
doesn't this need to be the date1.getTime() so you're comparing milliseconds since epoch?
@chovy Date coerces to Number. +new Date() is a common idiom as a shortcut to (new Date()).getTime()
|

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.