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

How to Sort Javascript Object Array By Date?

本文关键字:对象 数组排序 Javascript 何按 日期      更新时间:2024-02-14

我在按日期值对对象数组排序时遇到问题。我发现了许多其他用户以前问过的问题,我研究了所有可能的解决方案,但我仍然没有得到排序问题的解决方案。我创建了两个不同的数组来测试排序函数,但仍然无法按正确的顺序获取日期。这是我的数据:

[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;
});

我的输出仍然没有按正确的顺序对日期进行排序。我不确定我是做错了什么,还是在这种情况下会有其他问题。如果有人能帮忙,请告诉我。谢谢

这里的答案是正确的,但您永远不应该使用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);
});

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

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

您可以分割日期并按部分进行排序。

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>');

您粘贴的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;
});

演示

所以我尝试了上面的所有答案,其中一些答案为我的案例提供了接近但不完全的解决方案。所以我只是试着结合起来,这是我问题的正确解决方案:

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

如果我试图只返回A和B,这对一条记录有效,但当我在onChange下拉列表中切换用户时,我又得到了相反的日期。因此,用new Date()getTime()解决上述问题效果良好。谢谢大家的帮助!