This question already has an answer here:

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!

share|improve this question

marked as duplicate by Mathletics, cookie monster, Rad Lexus, karthik, Joe Frambach Jul 3 '14 at 20:43

This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.

1  
try return date1 - date2; – cookie monster Jul 3 '14 at 18:34
up vote 9 down vote accepted

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.

share|improve this answer
1  
You're sorting by the string value, which can fail. jsfiddle.net/3Wza8/2 You'll need to convert to dates first. – cookie monster Jul 3 '14 at 18:42
2  
Well now you're changing the data structure. You should provide a solution that works for the actual situation presented. – cookie monster Jul 3 '14 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. – lcoderre Jul 3 '14 at 19:12

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;
});
share|improve this answer
1  
Why not just return date1 - date2;? – Rocket Hazmat Jul 3 '14 at 18:35
    
I was under the assumption that sort expected -1, 0 or 1 – Joe Frambach Jul 3 '14 at 18:36
    
Thanks @RocketHazmat. Updated. – Joe Frambach Jul 3 '14 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. – cookie monster Jul 3 '14 at 18:37

Not the answer you're looking for? Browse other questions tagged or ask your own question.