使用sort()将对象移动到数组开头

3

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

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

但如果 date 未定义,则应将其放在开头。使用上面展示的代码,空数据集将被放置在末尾。


听起来快速且简单的方法就是反转数组?... array.sort(/* ...其他代码在这里... */).reverse() - Matt Oestreich
@MattOestreich 不,因为其他所有元素的排序不应该被反转。 - user3142695
明白了.. 哎呀,本来还指望它能有所帮助的。 - Matt Oestreich
日期字段可能有哪些可能的值?它应该是字符串还是整数? - Hubert Grzeskowiak
@user3142695,你的选择是错误的,因为它在Firefox上无法工作。 - Mister Jojo
显示剩余4条评论
1个回答

4

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)

2
你的a和b是数字,不需要将它们转换为日期来进行排序... - Mister Jojo
1
当然,但是原帖并没有展示他们的日期是什么,而数字作为占位符可以很好地代替他们所拥有的任何日期。 - gman
我对这个答案感到困惑...是只有我还是没有日期的对象不在打印出来的末尾?实际上,似乎根本没有进行任何排序? - Matt Oestreich
1
@HubertGrzeskowiak 没错,你说得对。我刚在Chrome中测试了一下,它可以工作。但是在Firefox中好像不行。哈哈,我差点就疯了。非常感谢你帮助我理解这个问题! - Matt Oestreich
1
这段代码在Chrome上没问题,但是在FireFox上有问题。 - Mister Jojo
显示剩余7条评论

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