Как сортировать по годам и месяцам в Javascript ES6 - PullRequest
0 голосов
/ 02 мая 2018

У меня есть массив, организованный таким образом.

const array = [
  {
    Year: 2018,
    Month: 'Dec'
  },
  {
    Year: 2017,
    Month: 'Apr'
  },
  {
    Year: 2018,
    Month: 'Mar'
  },
  {
    Year: 2018,
    Month: 'Oct'
  },
  {
    Year: 2017,
    Month: 'Jan'
  },
  {
    Year: 2018,
    Month: 'Apr'
  }
]

Я успешно организовал данные по годам или месяцам, но каждый раз, когда я пытаюсь упорядочить их по обоим сразу, то, какой бы один из них ни организовал последние, он вытеснит все до него. Я понимаю, почему он это делает, но никак не могу найти способ обойти это.

const sortedByYear = array.sort((a, b) => a.Year - b.Year);

Сортировка по году довольно просто.

const sorted = sortedByYear.sort((a, b) => Months.indexOf(a.Month) - Months.indexOf(b.Month));

Сортировка по месяцам.

Я попытался добавить какой-либо вид проверки в средство проверки Месяца, если совпадают годы, тогда прибегают, но это не решает проблему с тем, как он будет сортироваться.

Ответы [ 3 ]

0 голосов
/ 02 мая 2018

Вы можете использовать lodash sortBy и передать поля, которые вы хотите , отсортировать по как массив.

const sorted = _.sortBy(array, ['Year', 'Month']);

0 голосов
/ 02 мая 2018

Вы можете использовать комбинацию year и month для формирования критериев сравнения. padStart не будет работать в IE, поэтому вам может потребоваться полифилл для этого.

const input = [
  {
    Year: 2018,
    Month: 'Dec'
  },
  {
    Year: 2017,
    Month: 'Apr'
  },
  {
    Year: 2018,
    Month: 'Mar'
  },
  {
    Year: 2018,
    Month: 'Oct'
  },
  {
    Year: 2017,
    Month: 'Jan'
  },
  {
    Year: 2018,
    Month: 'Apr'
  }
];
const Months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
input.sort((a, b) =>`${a.Year}${Months.indexOf(a.Month).toString().padStart(2,0)}` - `${b.Year}${Months.indexOf(b.Month).toString().padStart(2,0)}`
);
console.log(input);
0 голосов
/ 02 мая 2018

Вам нужно будет поставить оба теста в вашу sort функцию:

const input = [
  {
    Year: 2018,
    Month: 'Dec'
  },
  {
    Year: 2017,
    Month: 'Apr'
  },
  {
    Year: 2018,
    Month: 'Mar'
  },
  {
    Year: 2018,
    Month: 'Oct'
  },
  {
    Year: 2017,
    Month: 'Jan'
  },
  {
    Year: 2018,
    Month: 'Apr'
  }
];
const Months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
input.sort((a, b) => {
  if (a.Year !== b.Year) return a.Year - b.Year;
  return Months.indexOf(a.Month) - Months.indexOf(b.Month)
});
console.log(input);
...