javascript - 按开始时间排序,按结束时间打破平局

标签 javascript sorting

我有一个包含开始和结束时间的对象列表:

let times = [
    {start: moment().add(1, 'days'), end: moment().add(2, 'days')},
    {start: moment().add(1, 'days'), end: moment().add(2, 'days')},
    {start: moment().add(4, 'days'), end: moment().add(5, 'days')},
    {start: moment().add(1, 'days'), end: moment().add(7, 'days')},
    {start: moment().add(2, 'days'), end: moment().add(3, 'days')},
]

我想按开始时间(最早到最晚)对这些时间进行排序,同时打破与结束时间的关系(较短的结束时间优先)。

所以结果将如下所示:

let sortedTimes = [
    {start: moment().add(1, 'days'), end: moment().add(2, 'days')},
    {start: moment().add(1, 'days'), end: moment().add(2, 'days')},
    {start: moment().add(1, 'days'), end: moment().add(7, 'days')},
    {start: moment().add(2, 'days'), end: moment().add(3, 'days')},
    {start: moment().add(4, 'days'), end: moment().add(5, 'days')},
]

是否有一种首选的 Javascript 方法可以使用高阶函数/最小语法来实现此目的?我开始写一个脚本,但逻辑包含很多 if - else if - else 语法,想知道是否有更好的方法。再次感谢!

最佳答案

从表面上看,我假设您正在使用 moment.js。这不使用高阶函数,而仅使用 Array.prototype.sort具有自定义比较器函数的方法,语法非常简洁:

times.sort(function(a, b) {
    return a.start.isBefore(b.start) ? -1 : a.start.isSame(b.start) ? a.end.isBefore(b.end) ? -1 : 1 : 1;
});

写出:

times.sort(function(a, b) {
    if (a.start.isBefore(b.start)) {
        return -1; // a before b
    } else if (a.start.isSame(b.start)) {
        // break tie on end
        if (a.end.isBefore(b.end)) {
            return -1; // a before b
        } else {
            return 1; // b before a
        }
    } else {
        return 1; // b before a
    }
}

这是一个plunkr如果您想看到它的实际效果。

关于javascript - 按开始时间排序,按结束时间打破平局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38679789/

相关文章:

javascript - 选中初始复选框时如何显示多个复选框(使用 PHP/Javascript)

javascript - 带列表的嵌套 Promise

java - java中整数排序首先返回负数?

java - 在 java 中对巨大的 file.txt 的行进行排序

javascript - 按特定内容排序 MongoDB 文档,然后按时间戳排序

c++ - 特殊排序算法和通用签名

javascript - 在具有值的表单中使用图像作为选项

javascript - 现在使用 jQuery - Backbone.Js 调用页面方法

javascript - 如何测试字符串是否为 JSON?

sorting - PARTITIONED BY、CLUSTERED BY 和 SORTED BY 与 BUCKETS 之间的 Hive 区别以及插入与 PARTITIONED 和 CLUSTER BY 的覆盖?