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.

5
  • 1
    You're sorting by the string value, which can fail. jsfiddle.net/3Wza8/2 You'll need to convert to dates first. Commented Jul 3, 2014 at 18:42
  • 3
    Well now you're changing the data structure. You should provide a solution that works for the actual situation presented. Commented Jul 3, 2014 at 18:56
  • 1
    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. Commented Jul 3, 2014 at 19:12
  • 2
    It would work as a string if the dates are in a format like YYYYMMDD where a chronological sort = a string sort Commented Feb 7, 2017 at 6:03
  • 1
    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. Commented Oct 24, 2017 at 22:57
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
  • 1
    Why not just return date1 - date2;? Commented Jul 3, 2014 at 18:35
  • I was under the assumption that sort expected -1, 0 or 1 Commented Jul 3, 2014 at 18:36
  • 1
    It just requires negative/positive numbers or 0. But the return results between the same two items should always be the same. Commented Jul 3, 2014 at 18:37
  • doesn't this need to be the date1.getTime() so you're comparing milliseconds since epoch? Commented Apr 1, 2017 at 7:04
  • @chovy Date coerces to Number. +new Date() is a common idiom as a shortcut to (new Date()).getTime() Commented Apr 1, 2017 at 14:38

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.