按开始时间排序,在结束时间打破关系

时间:2016-07-31 00:43:40

标签: 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语法,想知道是否有更好的方法。再次感谢!

2 个答案:

答案 0 :(得分:2)

从它的外观来看,我假设你正在使用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

答案 1 :(得分:1)

也许lodash sortBy

_.sortBy(times, ['start', 'end']);

请参阅: