javascript - 对表示没有年份的月份的整数进行排序

标签 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](二月、一月、十二月、十一月、十月、九月、八月。)

我正在使用以下内容,它在滚动到上一年的条件下运行良好:

> [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/

相关文章:

javascript - 如何检查 'string1'是否在 'string1, string2, string3, .. stringn'中

javascript - 使用 d3-fetch 模块加载多个文件

javascript - 缩放舞台和拖动元素的相对位置不起作用

sorting - 更改 Gitlab 问题的默认排序

javascript - 在整个页面中获取元素(即使它不可见)

javascript - 检索表中选择的行值作为数组并将结果发送到 React 上的另一个函数

javascript - 如何将多维数组从 PHP 传递到 Javascript?

c++ - 在 CUDA 中将动态分配的二维数组从主机复制到设备

algorithm - 选择或插入排序在学术环境之外有用吗?

c - 如何在 C 中对结构数组进行排序?