有一项任务是按上次登录的日期对用户进行排序。
我使用sort
moment.js 中的方法来解决这个问题。我的第一个决定是这样的。
myArray.sort((a ,b ) => {
return moment().diff(a.lastLoginAt, "seconds") - moment().diff(b.lastLoginAt, "seconds");
});
它没有用。我认为问题在于日期之间的差异非常大,特别是几个月。我想以秒为单位进行比较。
然后我就这样解决了这个问题,问题是代码结果很糟糕。
myArray.sort((a ,b ) => {
if ( moment().diff(a.lastLoginAt, "months") - moment().diff(b.lastLoginAt, "months") === 0 ) {
if ( moment().diff(a.lastLoginAt, "days") - moment().diff(b.lastLoginAt, "days") === 0 ) {
if ( moment().diff(a.lastLoginAt, "hours") - moment().diff(b.lastLoginAt, "hours") === 0 ) {
if ( moment().diff(a.lastLoginAt, "minutes") - moment().diff(b.lastLoginAt, "minutes") === 0 ) {
if ( moment().diff(a.lastLoginAt, "seconds") - moment().diff(b.lastLoginAt, "seconds") === 0 ) {
return moment().diff(a.lastLoginAt, "seconds") - moment().diff(b.lastLoginAt, "seconds");
}
} else {
return moment().diff(a.lastLoginAt, "minutes") - moment().diff(b.lastLoginAt, "minutes");
}
} else {
return moment().diff(a.lastLoginAt, "hours") - moment().diff(b.lastLoginAt, "hours");
}
} else {
return moment().diff(a.lastLoginAt, "days") - moment().diff(b.lastLoginAt, "days");
}
} else {
return moment().diff(a.lastLoginAt, "months") - moment().diff(b.lastLoginAt, "months")
}
});
这段代码的工作原理是这样的。如果月份相等,则按天比较,如果天数相等,则按小时比较,依此类推。
问题是如何写更简洁,它可以以某种方式动态写入块if
,但我不知道如何。
正如Zhihar timestamp 所回答的那样,将解决问题,并且不需要缠绕这么多但有这么多相同的线?为什么?将它包装在一个函数中并像这样调用它不是更好吗
然后如果
这不是问题的答案,而只是试图提高对 JS 可能性的理解
做这样的事情会更有意义:
其中 a.lastLoginAt, b.lastLoginAt 适合 Date 构造函数。