按属性值对JavaScript对象数组进行排序

41

我有一个 JavaScript 对象数组。我的数组定义如下:

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' }
];

这个数组实际上是动态生成的。不过,我需要按照createdon值升序对结果进行排序。为了做到这一点,我正在尝试使用lodash。createdon值代表一个日期。目前,我正在尝试以下操作:

//  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);
});

很遗憾,在运行该函数之后,myObjects仍然没有被排序。我做错了什么?

谢谢!


1
尝试使用 return date1 - date2; - cookie monster
2个回答

78

我刚刚看过 lodash 的文档,也许你可以尝试使用 sortBy

试一下吧: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);
});

编辑:正如 Cookie Monster 指出的那样,你的 createdon 字段必须是一个日期而不是字符串。


1
您正在按字符串值进行排序,这可能会失败。http://jsfiddle.net/3Wza8/2/ 您需要先转换为日期。 - cookie monster
3
你现在正在改变数据结构,你需要提供一个适用于实际情况的解决方案。 - cookie monster
1
我理解你的观点,但考虑到问题的上下文信息,我认为这是 OP 的一个潜在解决方案。不过还是谢谢你,我会记住的。 - lcoderre
2
如果日期的格式为YYYYMMDD,那么它将作为字符串工作,其中按时间顺序排序=按字符串排序。 - Clyde D'Cruz
1
对我来说,我需要按desc顺序排序,所以我使用了_.orderBy(arrOfObjs, 'sort_key', 'desc')。这种方法非常强大,你应该查看一下相关文档。 - user888750

2
问题在于sort需要一个返回-1、0或1的函数。而你的函数只返回0和1。
稍作修改就可以解决这个问题:
myObjects.sort(function (a, b) {
  var date1 = new Date(a['createdon']);
  var date2 = new Date(b['createdon']);
  return date1 - date2;
});

1
为什么不直接写return date1 - date2;呢? - gen_Eric
我曾经认为排序函数期望返回-1、0或1。 - Joe Frambach
1
它只需要负数/正数或0。但是同一两个项目之间的返回结果应始终相同。 - cookie monster
这个需要使用 date1.getTime() 吗?这样才能将时间转换成自纪元以来的毫秒数进行比较。 - chovy
new Date() + 1000 //=> "Sun Apr 02 2017 14:00:05 GMT-0700 (PDT)1000"不是我预期的结果。 - chovy
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接