我有很多总数对应于过去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]
(2月,1月,12月,11月,10月,9月,8月)。
我正在使用以下内容,它在滚动到上一年的条件下运行良好:
> [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之间(包括端点),月份可能不一定是连续的。对我的逻辑有任何帮助都会非常感激!
答案 0 :(得分:3)
这是一种根据&#34;本月&#34;对数组进行排序的方法。是
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);
&#13;
答案 1 :(得分:1)
您可以使用偏移量和模数进行排序,以移动排序的起始值。
const sort = month => (a, b) => (b.month + 12 - month) % 12 - (a.month + 12 - month) % 12;
var data = [{ 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 }];
console.log(data.sort(sort(1))); // 0 11 10 9 8 7 1
console.log(data.sort(sort(8))); // 7 1 0 11 10 9 8
&#13;
.as-console-wrapper { max-height: 100% !important; top: 0; }
&#13;