如何按日期对对象数组进行排序?

47

我正在尝试对一个包含对象的数组进行排序,每个对象都包含:

var recent = [{id: "123",age :12,start: "10/17/13 13:07"} , {id: "13",age :62,start: "07/30/13 16:30"}];

日期格式为:mm/dd/yy hh:mm

我想按照最新的日期顺序排序。如果日期相同,则应按其时间部分排序。

我尝试了下面的 sort() 函数,但它不起作用:

recent.sort(function(a,b))
{
    a = new Date(a.start);
    b = new Date(b.start);
    return a-b;
});

同时,我应该如何迭代对象进行排序?类似于这样:

for (var i = 0; i < recent.length; i++)
    {
        recent[i].start.sort(function (a, b)
        {
            a = new Date(a.start);
            b = new Date(b.start);
            return a-b; 
        } );
    }

数组中可以有任意数量的对象。

4个回答

65

正如评论中指出的那样,recent 的定义在 javascript 中是不正确的。

但是假设日期是字符串:

var recent = [
    {id: 123,age :12,start: "10/17/13 13:07"}, 
    {id: 13,age :62,start: "07/30/13 16:30"}
];

然后按照以下方式排序:

recent.sort(function(a,b) { 
    return new Date(a.start).getTime() - new Date(b.start).getTime() 
});

从W3Schools了解sort函数的更多细节


1
你可以在这里找到一些有用的关于此主题的答案:**按日期排序Javascript对象数组**。 - jherax
2
注意:不要忘记显式的return声明。 - pruett
1
对于最近的时间应该是 new Date(b.start).getTime() - new Date(a.start).getTime(),这样才正确。 - BrunoElo

7
recent.sort(function(a,b) { return new Date(a.start).getTime() - new Date(b.start).getTime() } );

减去日期对象显然返回与减去它们的 getTime() 值相同的结果,尽管我在任何规范中都找不到这个要求。 - Barmar
是的,我注意到了,尽管getTime()始终保持一致,但由于原帖想要时间组件在排序时显式使用,因此具体说明是有意义的。 - Tom Bowers
一个更大的兼容性问题可能是解析 mm/dd/yy 格式不具备可移植性。 - Barmar
这是一个很好的观点。一般来说,如果需要可移植性,应使用ISO日期。 - Tom Bowers

5

ES6:

recent.sort((a,b)=> new Date(b.start).getTime()-new Date(a.start).getTime());

1
这个函数允许你创建一个比较器,可以沿着路径走到你想要比较的键。

function createDateComparator ( path = [] , comparator = (a, b) => a.getTime() - b.getTime()) {
  return (a, b) => {
    let _a = a
    let _b = b
    for(let key of path) {
      _a = _a[key]
      _b = _b[key]
    }
    return comparator(_a, _b)
  }
}


const input = (
  [ { foo: new Date(2017, 0, 1) }
  , { foo: new Date(2018, 0, 1) }
  , { foo: new Date(2016, 0, 1) }
  ]
)

const result = input.sort(createDateComparator([ 'foo' ]))

console.info(result)


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