【问题标题】:Sort array of JavaScript objects by property value [duplicate]按属性值对 JavaScript 对象数组进行排序 [重复]
【发布时间】:2014-08-25 00:02:37
【问题描述】:

我有一个 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 仍然没有排序。我做错了什么?

谢谢!

【问题讨论】:

  • 试试return date1 - date2;

标签: javascript arrays sorting lodash


【解决方案1】:

问题在于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;
});

【讨论】:

  • 为什么不直接return date1 - date2;
  • 我假设 sort 预期为 -1、0 或 1
  • 感谢@RocketHazmat。已更新。
  • 它只需要负数/正数或0。但是相同的两个项目之间的返回结果应该总是相同的。
  • 这不需要是date1.getTime(),所以您要比较自纪元以来的毫秒数?
【解决方案2】:

我刚刚浏览了lodash doc,也许你could try 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 字段是日期,而不是字符串。

【讨论】:

  • 您正在按字符串值排序,这可能会失败。 jsfiddle.net/3Wza8/2您需要先转换为日期。
  • 现在您正在更改数据结构。您应该提供一个适用于所呈现的实际情况的解决方案。
  • 我明白你的意思,但鉴于问题的上下文信息,我认为这是 OP 的潜在解决方案。不过谢谢,我会记住这一点的。
  • 如果日期的格式为 YYYYMMDD,其中按时间排序 = 字符串排序,它将作为字符串工作
  • 对我来说,我需要desc 订单,所以我使用了_.orderBy(arrOfObjs, 'sort_key', 'desc')。这个方法很强大,你应该看看上面的文档。