排序表示没有年数的月份的整数

时间:2018-02-07 19:09:49

标签: javascript arrays sorting

我有很多总数对应于过去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之间(包括端点),月份可能不一定是连续的。对我的逻辑有任何帮助都会非常感激!

2 个答案:

答案 0 :(得分:3)

这是一种根据&#34;本月&#34;对数组进行排序的方法。是

&#13;
&#13;
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;
&#13;
&#13;

答案 1 :(得分:1)

您可以使用偏移量和模数进行排序,以移动排序的起始值。

&#13;
&#13;
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;
&#13;
&#13;