【问题标题】:Move objects at the beginning of array using sort()使用 sort() 在数组开头移动对象
【发布时间】:2020-04-18 08:01:51
【问题描述】:

我需要按日期值对对象数组进行排序:

array.sort(function(a,b){
return new Date(b.date) - new Date(a.date);
})

但如果date未定义,则应该放在开头。使用上面显示的代码,空数据集将放在最后。

【问题讨论】:

  • 听起来快速而肮脏的只是反转数组?...array.sort(/* ...other code here... */).reverse()
  • @MattOestreich 不,因为所有其他元素的排序不应颠倒
  • 明白了..该死的希望这会有所帮助..
  • 日期字段的可能值是什么?它应该是字符串还是整数?
  • @MisterJojo 这就是我询问输入的原因。 Date 构造函数也支持字符串

标签: javascript arrays sorting ecmascript-6


【解决方案1】:

const array = [
  { date: 624000, name: 'Eddison', },
  { date: 224000, name: 'Bobby', },
  {               name: '--no date 2' },
  { date: 924000, name: 'Fred', },
  { date: 124000, name: 'Abe', },
  {               name: '--no date 1' },
  { date: 424000, name: 'David', },
  { date: 324000, name: 'Catheryn', },
];

// assuming there is no 0 date
array.sort(function(a, b) {
  return (a.date && b.date)
      ? new Date(b.date) - new Date(a.date)
      : (a.date || 1) - (b.date || 1); 
});

//result
array.forEach(elem => console.log(JSON.stringify(elem)));

请注意,如果您关心日期 0 和未定义日期之间的差异,那么

  return (a.date !== undefined && b.date !== undefined)

【讨论】:

  • 您的 a 和 b 是数字,无需将它们转换为日期进行排序...
  • 当然,但是 OP 没有显示他们的日期是什么,并且数字可以很好地作为他们所拥有的任何东西的占位符。
  • 请注意,OP 澄清他们有 ISO 日期字符串
  • @HubertGrzeskowiak 是的,你是对的,我刚刚在 Chrome 中进行了测试,它可以工作.. 这似乎在 Firefox 中不起作用.. 哇,我在那里疯了一秒钟哈哈。非常感谢您帮助我掌握这一点!
  • 这段代码在 Chrome 上正常,但在 FireFox 上错误
猜你喜欢
  • 1970-01-01
  • 2021-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-28
  • 2018-04-19
  • 1970-01-01
相关资源
最近更新 更多