我有一个包含开始和结束时间的对象列表:
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/