我有许多总计数组,与过去 180 天的整数表示的月份相对应。例如:
[
{total: 54, month: 0},
{total: 55, month: 11},
{total: 74, month: 10},
{total: 21, month: 1},
{total: 36, month: 9},
{total: 98, month: 8},
{total: 55, month: 7},
]
我需要按月对这些数组中的元素进行排序,以便最近的月份排在前面。例如,[0, 11, 10, 1, 9, 8, 7]
应排序为 [1, 0, 11, 10, 9, 8, 7]
(二月、一月、十二月、十一月、十月、九月、八月。)
我正在使用以下内容,它在滚动到上一年的条件下运行良好:
> [0, 11, 10, 1, 9, 8, 7].sort((a, b) => Math.abs(a-b) > 6 ? a-b : b-a);
< [1, 0, 11, 10, 9, 8, 7] // good
但是,它似乎不适用于这种情况:
> [11, 1, 0, 5, 4, 3, 2].sort((a, b) => Math.abs(a-b) > 6 ? a-b : b-a);
< [1, 0, 11, 5, 4, 3, 2] // should be [5, 4, 3, 2, 1, 0, 11]
如果我将条件更改为 > 5
那么它可以工作,但会因另一个用例而中断:
> [11, 1, 0, 5, 4, 3, 2].sort((a, b) => Math.abs(a-b) > 5 ? a-b : b-a);
< [5, 4, 3, 2, 1, 0, 11] // good
> [11, 10, 9, 8, 7, 1, 0].sort((a, b) => Math.abs(a-b) > 5 ? a-b : b-a);
< [11, 10, 9, 8, 7, 1, 0] // :-(
> [11, 10, 9, 8, 7, 1, 0].sort((a, b) => Math.abs(a-b) > 6 ? a-b : b-a);
< [1, 0, 11, 10, 9, 8, 7] // what I'd expect changing back to 6
我的逻辑是,如果两个月之间的差异大于六,则将它们排序为相反,而不是月份接近或小于或等于六。数组的长度可以在 1 到 7(含)之间,并且月份不一定是连续的。任何对我的逻辑的帮助将不胜感激!
最佳答案
这是一种根据“本月”对数组进行排序的方法。
var months = [11, 10, 9, 8, 7, 1, 0];
var thisMonth = 1; // get this from date object, eg
thisMonth += 12; // we want thisMonth - some month to be non-negative
months.sort((a, b) => {
return (thisMonth - a) % 12 - (thisMonth - b) % 12;
});
console.log(months);
关于javascript - 对表示没有年份的月份的整数进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48671538/