43

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

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

4 回答 4

61

正如评论中指出的那样,最近的定义不是正确的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 中有关排序功能的更多详细信息

于 2013-10-17T15:23:35.220 回答
5
recent.sort(function(a,b) { return new Date(a.start).getTime() - new Date(b.start).getTime() } );
于 2013-10-17T15:16:02.980 回答
0

此函数允许您创建一个比较器,该比较器将遍历您想要比较的键的路径:

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)

于 2016-12-05T21:08:16.920 回答
0

ES6:

recent.sort((a,b)=> new Date(b.start).getTime()-new Date(a.start).getTime());
于 2019-07-05T01:47:02.357 回答