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

时间:2016-04-07 13:45:10

标签: javascript arrays sorting date

我有一个问题是按日期值对对象数组进行排序。我发现其他用户之前问过很多问题,我经历了所有可能的解决方案,但仍然无法解决我的排序问题。我创建了两个不同的数组来测试排序功能,但仍然无法按正确的顺序获取日期。这是我的数据:

[Object { eventDate="12/12/2016",  display_order="5"},Object { eventDate="12/12/2016",  display_order="3"}]

[Object { eventDate="04/21/2016",  display_order="3"},Object { eventDate="04/21/2016",  display_order="1"}]

我使用此逻辑按日期值对数据进行排序:

entries.sort(function(a,b){
    var i = new Date(a.eventDate);
    var j = new Date(b.eventDate);
    return i-j;
});

我的数据仍未使用此功能按正确顺序排序。然后我也尝试对我的数组进行排序:

var dates = Object.keys(groupedByDate);

console.log(dates)

这是可变日期的输出:["12/12/2016", "04/21/2016"]

然后我试着这样做:

dates.sort(function(a, b) {
    a = new Date(a.dates);
    b = new Date(b.dates);
    return a>b ? -1 : a<b ? 1 : 0;
});

我的输出仍然没有按正确的顺序排序我的日期。在这种情况下,我不确定我是做错了什么还是别的什么问题。如果有人可以提供帮助,请告诉我。感谢。

5 个答案:

答案 0 :(得分:1)

使用Date.getTime()函数(按毫秒数)对日期进行排序:

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

答案 1 :(得分:1)

您可以拆分日期并按部件排序。

var array = [{ eventDate: "12/12/2016", display_order: "5" }, { eventDate: "12/12/2016", display_order: "3" }, { eventDate: "04/21/2016", display_order: "3" }, { eventDate: "04/21/2016", display_order: "1" }];

array.sort(function (a, b) {
    var aa = a.eventDate.split('/'),
        bb = b.eventDate.split('/');
    return aa[2] - bb[2] || aa[0] - bb[0] || aa[1] - bb[1];
});

document.write('<pre>' + JSON.stringify(array, 0, 4) + '</pre>');

答案 2 :(得分:1)

似乎您粘贴的json中存在问题。{ eventDate="12/12/2016", display_order="3"}。而不是=它必须是: 假设你有正确的json格式 以下解决方案可能很有用

var array = [{ eventDate:"12/12/2016",  display_order:"5"}, 
                { eventDate:"12/12/2016",  display_order:"3"},
                { eventDate:"04/21/2016",  display_order:"3"},
                { eventDate:"04/21/2016",  display_order:"1"}];

// Generic solution
var sortedArray = array.sort(function(a,b) { 
    return new Date(a.eventDate).getTime() - new Date(b.eventDate).getTime() 
});


// Solution using ternary operator
var l =array.sort(function(a,b){
  return a.eventDate>b.eventDate ? -1 : a.eventDate<b.eventDate ? 1 : 0;
});

Demo

答案 3 :(得分:1)

这里的答案是在正确的轨道上但你永远不应该使用Date构造函数或Date.parse来解析字符串。使用库并传递格式,或编写一个简单的函数,例如

function parseMDY(s) {
  var b = s.split('/');
  return new Date(b[2],b[0]-1,b[1]);
}

document.write(parseMDY('4/30/2016'));

所以现在你有:

entries.sort(function(a,b) {
  return parseMDY(a) - parseMDY(b);
});

答案 4 :(得分:0)

所以我尝试了上面的所有答案,其中一些给了我接近但不完全解决我的情况。所以我只是尝试结合,这是我的问题的正确解决方案:

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

如果我试图返回A和B,这对一条记录起作用,但是当我在onChange下拉切换用户时,我又得到了反向日期。因此,使用new Date()getTime()的解决方案可以正常工作。谢谢大家的帮助!