我有一个包含开始和结束时间的对象列表:
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
语法,想知道是否有更好的方法。再次感谢!
答案 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']);
请参阅: