如何按日期对 $.each() 函数进行排序

Posted

技术标签:

【中文标题】如何按日期对 $.each() 函数进行排序【英文标题】:How do I sort $.each() functions by date 【发布时间】:2019-05-20 15:58:00 【问题描述】:

基本上我需要对 $.each(messages, function()); 进行排序按我的数组中的日期。我尝试过的方法没有奏效,正在努力寻找一个好的方法。

我主要尝试使用 sort 函数对日期进行排序,但要么在控制台中收到关于它不是函数的错误,要么它根本没有做任何事情。

var messages = [
        
            contact_name: "Josef Braga",
            time: "2018-12-20 01:53:49",
            isRead: 1,
        ,
        
            contact_name: "289-1445",
            time: "2018-12-20 02:53:49",
            isRead: 0,
        ,
    ];

    $(".phone-content").append("<div class='phone-inner'></div>");
    $.each(messages, function () 
        $(".phone-inner").append("" +
            "<div data-date='" + this.time + "' class='phone-message'>" +
            "                    <div class='mtop'>" +
            "                        <p class='c-left " + (!this.isRead ? "new-message" : "") + "'>" + this.contact_name + "</p>" +
            "                        <p class='c-right'>" + relative_time(this.time) + "</p>" +
            "                    </div>" +
            "                    <div class='mdesc'>" +
            "                        <p>Dette er en ny besked! Hold da kæft hvor fedt mayn!</p>" +
            "                    </div>" +
            "                    <hr />" +
            "                </div>" +
            "            </div>");
    );

预期的结果应该是最新的消息排在顶部 - 但它只是按照它在消息数组中设置的方式对其进行排序。

【问题讨论】:

【参考方案1】:

在您的情况下,时间是一个字符串,因此它按字母顺序排序。您需要先将时间转换为时间戳(将是数字),然后对其进行排序。

例如,假设您的消息数组如下所示:

var messages = [
    
        contact_name: "Josef Braga",
        time: "2018-12-20 01:53:49",
        isRead: 1,
    ,
    
        contact_name: "289-1445",
        time: "2018-12-20 02:53:49",
        isRead: 0,
    ,
    
        contact_name: "289-1445",
        time: "2018-12-19 02:53:49",
        isRead: 0,
    ,
    
        contact_name: "289-1445",
        time: "2018-12-19 02:54:49",
        isRead: 0,
    
];

使用此函数进行排序:

messages.sort(function(a, b)return Date.parse(a.time) - Date.parse(b.time));

将输出:

    [
        contact_name: "289-1445",
        time: "2018-12-19 02:53:49",
        isRead: 0,
    ,
    
        contact_name: "289-1445",
        time: "2018-12-19 02:54:49",
        isRead: 0,
    
    
        contact_name: "Josef Braga",
        time: "2018-12-20 01:53:49",
        isRead: 1,
    ,
    
        contact_name: "289-1445",
        time: "2018-12-20 02:53:49",
        isRead: 0,
    ]

然后你可以做 $.each。 希望这是你想要的。

【讨论】:

一个伟大而简单的解决方案。它工作得很好,谢谢! - 我尝试做类似的事情,但没有任何结果 - 也有一个很好的解释:)【参考方案2】:

幸运的是,您的 time 属性的格式使这变得容易 - 只需调用 sort 并使用 localeCompare 检查哪个 .time 先出现,假设它们始终采用 YYYY-MM-DD hh:mm:ss 格式:

var messages = [
    contact_name: "Josef Braga",
    time: "2018-12-20 01:53:49",
    isRead: 1,
  ,
  
    contact_name: "289-1445",
    time: "2017-12-20 02:53:49",
    isRead: 0,
  ,
  
    contact_name: "289-1445",
    time: "2018-12-20 02:45:49",
    isRead: 0,
  ,
  
    contact_name: "289-1445",
    time: "2018-12-20 03:01:49",
    isRead: 0,
  ,
  
    contact_name: "289-1445",
    time: "2018-12-20 02:53:49",
    isRead: 0,
  ,
];
messages.sort((a, b) => b.time.localeCompare(a.time));
console.log(messages);

【讨论】:

此解决方案还解决了我的问题,但也解决了它。谢谢!

以上是关于如何按日期对 $.each() 函数进行排序的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Vue.js 2 按日期对数组进行排序

如何按日期对我的表格视图中的数组进行排序

如何按日期对 DataTable 列进行排序

如何按修改日期对 CloudKit 结果进行排序?

如何在 MongoDB 中按日期对集合进行排序?

如何按日期时间和整数对光标进行排序