如何使用多个datetime列对javascript数组进行排序

如何使用多个datetime列对javascript数组进行排序,javascript,Javascript,给定以下数组: var effectiveDates= [ { actualDate: "2017-08-29", effectiveDate: "2017-01-01", time: "13:22" }, { actualDate: "2017-08-29", effectiveDate: "2017-01-01", time: "11:33" }, {

给定以下数组:

var effectiveDates= [
    {
        actualDate: "2017-08-29",
        effectiveDate: "2017-01-01",
        time: "13:22"
    },
    {
        actualDate: "2017-08-29",
        effectiveDate: "2017-01-01",
        time: "11:33"
    },
    {
        actualDate: "2017-08-29",
        effectiveDate: "2017-01-01",
        time: "10:57"
    },
    {
        actualDate: "2016-06-17",
        effectiveDate: "2016-01-01",
        time: "10:26"
    },
    {
        actualDate: "2016-06-17",
        effectiveDate: "2016-01-01",
        time: "10:03"
    },
    {
        actualDate: "2015-12-03",
        effectiveDate: "2015-01-01",
        time: "16:54"
    },
    {
        actualDate: "2014-07-07",
        effectiveDate: "2014-05-01",
        time: "10:47"
    },
    {
        actualDate: "2014-07-07",
        effectiveDate: "2014-05-01",
        time: "10:41"
    },
    {
        actualDate: "2014-07-07",
        effectiveDate: "2014-01-01",
        time: "10:36"
    },
    {
        actualDate: "2014-07-07",
        effectiveDate: "2014-01-01",
        time: "10:36"
    }
]
我试图根据
actualDate
effectiveDate
降序(或根据顺序升序)然后按时间(也根据所需顺序升序或降序)对数据进行排序。我遇到的问题是日期顺序正确,但
time
属性顺序不正确。我正在使用moment.js进行日期和时间解析

这就是我迄今为止所做的尝试:

var desc = true; //false;
effectiveDates.sort(function (a, b) {
            if (desc) {
                if (moment(a.actualDate) === moment(b.actualDate)) {
                    return (moment(b.time) - moment(a.time));
                } else if (moment(a.actualDate) < moment(b.actualDate)) {
                    return 1;
                } else if (moment(a.actualDate) > moment(b.actualDate)) {
                    return -1;
                }
            }
            else {
                if (moment(a.actualDate) === moment(b.actualDate)) {
                    return (moment(b.time) - moment(a.time));
                } else if (moment(a.actualDate) > moment(b.actualDate)) {
                    return 1;
                } else if (moment(a.actualDate) < moment(b.actualDate)) {
                    return -1;
                }
            }
        });
var desc=true//虚假的;
effectiveDates.sort(函数(a,b){
如果(描述){
if(力矩(a.实际值)==力矩(b.实际值)){
返回(时刻(b.time)-时刻(a.time));
}否则如果(力矩(a.实际值)<力矩(b.实际值)){
返回1;
}否则,如果(力矩(a.实际值)>力矩(b.实际值)){
返回-1;
}
}
否则{
if(力矩(a.实际值)==力矩(b.实际值)){
返回(时刻(b.time)-时刻(a.time));
}否则,如果(力矩(a.实际值)>力矩(b.实际值)){
返回1;
}否则如果(力矩(a.实际值)<力矩(b.实际值)){
返回-1;
}
}
});
出于某种原因,当按
effectiveDate
升序或降序对数据排序时,
时间的排序是正确的。
但是当按
实际日期
对数据进行排序时,同时按升序或降序排序时,
时间
数据不正确

任何帮助都将不胜感激。

代替

return (moment(b.time) - moment(a.time));
使用:

您需要告诉矩量.js输入字符串是“时间”字符串。

三个问题:

  • 使用
    ==
    来比较两个
    时刻将不起作用;他们永远不会平等。矩提供了一个
    .isname
    函数来执行此操作
  • 要解析时间,您需要提供一个格式字符串,在本例中为
    “HH:mm”
  • 两次减法需要在升序和降序之间反向进行。把订单翻过来就行了
  • 请参阅下面的工作版本,并附上说明更改的注释:

    function sorted(desc) {
        return effectiveDates.sort(function (a, b) {
            if (desc) {
                // Use .isSame to compare two moments:
                if (moment(a.actualDate).isSame(moment(b.actualDate))) {
                    // Provide a format to moment so it knows how to parse the times:
                    return moment(b.time, "HH:mm") - moment(a.time, "HH:mm");
                } else if (moment(a.actualDate) < moment(b.actualDate)) {
                    return 1;
                } else if (moment(a.actualDate) > moment(b.actualDate)) {
                    return -1;
                }
            }
            else {
                if (moment(a.actualDate).isSame(moment(b.actualDate))) {
                    // Reverse the order of the subtraction when sorting ascending:
                    return moment(a.time, "HH:mm") - moment(b.time, "HH:mm");
                } else if (moment(a.actualDate) > moment(b.actualDate)) {
                    return 1;
                } else if (moment(a.actualDate) < moment(b.actualDate)) {
                    return -1;
                }
            }
        });
    }
    
    是:

    更新

    更简单的比较器功能:

    function sorted(desc) {
        return effectiveDates.sort(function (a, b) {
            // Combine the date and time and parse them together.
            var ret = moment(a.actualDate + " " + a.time) - moment(b.actualDate + " " + b.time);
    
            // Flip the sign if we're sorting descending.
            if (desc) {
                ret *= -1;
            }
    
            return ret;
        });
    }
    

    与其调用
    moment(a.actualDate)
    大量时间,不如将它们存储在一个变量中:
    aDate=moment(a.actualDate)
    等。在这两种情况下,您的时间比较是在同一个方向上进行的。也不需要为else。。。。您可以只设置一组,然后根据描述翻转-1或1。
    console.log("DESCENDING:");
    console.log(sorted(true));
    
    console.log("ASCENDING:");
    console.log(sorted(false));
    
    DESCENDING:
    [ { actualDate: '2017-08-29',
        effectiveDate: '2017-01-01',
        time: '13:22' },
      { actualDate: '2017-08-29',
        effectiveDate: '2017-01-01',
        time: '11:33' },
      { actualDate: '2017-08-29',
        effectiveDate: '2017-01-01',
        time: '10:57' },
      { actualDate: '2016-06-17',
        effectiveDate: '2016-01-01',
        time: '10:26' },
      { actualDate: '2016-06-17',
        effectiveDate: '2016-01-01',
        time: '10:03' },
      { actualDate: '2015-12-03',
        effectiveDate: '2015-01-01',
        time: '16:54' },
      { actualDate: '2014-07-07',
        effectiveDate: '2014-05-01',
        time: '10:47' },
      { actualDate: '2014-07-07',
        effectiveDate: '2014-05-01',
        time: '10:41' },
      { actualDate: '2014-07-07',
        effectiveDate: '2014-01-01',
        time: '10:36' },
      { actualDate: '2014-07-07',
        effectiveDate: '2014-01-01',
        time: '10:36' } ]
    ASCENDING:
    [ { actualDate: '2014-07-07',
        effectiveDate: '2014-01-01',
        time: '10:36' },
      { actualDate: '2014-07-07',
        effectiveDate: '2014-01-01',
        time: '10:36' },
      { actualDate: '2014-07-07',
        effectiveDate: '2014-05-01',
        time: '10:41' },
      { actualDate: '2014-07-07',
        effectiveDate: '2014-05-01',
        time: '10:47' },
      { actualDate: '2015-12-03',
        effectiveDate: '2015-01-01',
        time: '16:54' },
      { actualDate: '2016-06-17',
        effectiveDate: '2016-01-01',
        time: '10:03' },
      { actualDate: '2016-06-17',
        effectiveDate: '2016-01-01',
        time: '10:26' },
      { actualDate: '2017-08-29',
        effectiveDate: '2017-01-01',
        time: '10:57' },
      { actualDate: '2017-08-29',
        effectiveDate: '2017-01-01',
        time: '11:33' },
      { actualDate: '2017-08-29',
        effectiveDate: '2017-01-01',
        time: '13:22' } ]
    
    function sorted(desc) {
        return effectiveDates.sort(function (a, b) {
            // Combine the date and time and parse them together.
            var ret = moment(a.actualDate + " " + a.time) - moment(b.actualDate + " " + b.time);
    
            // Flip the sign if we're sorting descending.
            if (desc) {
                ret *= -1;
            }
    
            return ret;
        });
    }