使用sort()在数组的开头移动对象

时间:2019-12-29 01:11:22

标签: javascript arrays sorting ecmascript-6

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

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

但是,如果date未定义,则应将其放在开头。上面显示了我的代码,空数据集将放置在末尾。

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:-2)

我更喜欢这个答案:
此代码在Chrome和FireFox上确定
比我在这里看到的所有其他答案更快 ;)

const array = 
      [ { date: '2019-12-24T03:24:00Z', name: 'Eddison'     } 
      , { date: '2019-12-25T02:34:00Z', name: 'Fred'        }     
      , {                               name: '--no date 2' } 
      , { date: '2019-12-24T04:56:00Z', name: 'Bobby'       } 
      , {                               name: '--no date 1' } 
      , { date: '2019-12-26T01:23:00Z', name: 'Catheryn'    } 
      ];

array.sort((a,b)=> (a.date)?          // if (a.date !== undefined) 
                   (b.date)?          // if (b.date !== undefined) 
                   (new Date(b.date) -new Date(a.date))
                   :+1                // when b.date is undefined
                   :(b.date)? -1: 0); // when a.date is undefined && b.date exist or not

//result
for (x of array) console.log(JSON.stringify(x));