Javascript - 按两个日期属性排序对象数组

时间:2017-02-28 15:21:19

标签: javascript arrays lodash

我有一个包含两种不同类型对象的数组,每个对象都有自己的日期字段,其中键不同。见下文:

const array = [
  { id: 1, occurs_at: '2017-02-03T07:00:01.000Z' },
  { id: 2, occurs_at: '2017-02-03T10:00:01.000Z' },
  { id: 3, start: '2017-02-03T04:00:01.000Z' },
  { id: 4, start: '2017-02-03T06:00:01.000Z' },
];

我试图按升序排列它们,但我似乎无法找到解决方案。我一直在使用Lodash进行基于单个属性的其他排序。有什么想法吗?

3 个答案:

答案 0 :(得分:5)

您可以测试所需属性,并仅使用具有真实值的属性。

Tc
var array = [{ id: 1, occurs_at: '2017-02-03T07:00:01.000Z' }, { id: 2, occurs_at: '2017-02-03T10:00:01.000Z' }, { id: 3, start: '2017-02-03T04:00:01.000Z' }, { id: 4, start: '2017-02-03T06:00:01.000Z' }];

array.sort(function (a, b) {
    return (a.occurs_at || a.start).localeCompare(b.occurs_at || b.start);
});

console.log(array);

答案 1 :(得分:0)

我会使用sortBy()pick()

const sorted = _.sortBy(array, i => new Date(
  _(i)
    .pick(['occurs_at', 'start'])
    .values()
    .first()
));

如果您知道每个集合项目将具有occurs_atstart属性作为日期字符串,则可以使用pick()来获取这两者。显然只存在一个,所以这将返回一个具有正确值的对象。

此时,您不再关心密钥,因为您知道它是一个具有单个日期值的对象。因此,您可以使用values()first()来获取它。

答案 2 :(得分:-3)

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