Angular 8: упорядочить последовательности массивов по часам - PullRequest
2 голосов
/ 13 января 2020

У меня есть массив вроде

array: [
{hour: 3pm, data:[]},
{hour: 8am, data:[]},
{hour: 9am, data:[]},
{hour: 12pm, data:[]},
{hour: 2pm, data:[]},
{hour: 10am, data:[]},
{hour: 1pm, data:[]},
{hour: 11am, data:[]},
]; 

Я хочу, чтобы он располагался в порядке возрастания по часам, как

array: [
{hour: 8am, data:[]},
{hour: 9am, data:[]},
{hour: 10am, data:[]},
{hour: 11am, data:[]},
{hour: 12pm, data:[]},
{hour: 1pm, data:[]},
{hour: 2pm, data:[]},
{hour: 3pm, data:[]},
];

Я пытался использовать сортировку, но в результате я получил

array:[
{hour:08, data:[]},
{hour:09, data:[]},
...
];

Я хочу, чтобы час оставался в 8 утра, 9 утра и так далее. есть ли вообще это сделать?

Ответы [ 4 ]

2 голосов
/ 13 января 2020

Вы можете попробовать эту ссылку из @ GabrielBiga

Рабочий пример: Stackblitz

this.array.sort((a, b) => {
      let time1 = parseInt(a.hour);
      let time2 = parseInt(b.hour);
      if (a.hour.match(/.*pm/) && time1 < 12) time1 += 12;
      else if (a.hour.match(/.*am/) && time1 == 12) time1 = 0;

      if (b.hour.match(/.*pm/) && time2 < 12) time2 += 12;
      else if (b.hour.match(/.*am/) && time2 == 12) time2 = 0;

      if (time1 < time2) return -1;
      if (time1 > time2) return 1;
      return 0;
    });
2 голосов
/ 13 января 2020

Вы пробовали Array.sort ?

let x = [
    {hour: '3pm', data:[]},
    {hour: '8am', data:[]},
    {hour: '9am', data:[]},
    {hour: '12pm', data:[]},
    {hour: '2pm', data:[]},
    {hour: '10am', data:[]},
    {hour: '1pm', data:[]} 
]; 

let final = x.sort((a, b) => {
    let time1 = parseInt(a.hour);
    let time2 = parseInt(b.hour);
    if(a.hour.match(/.*pm/)) time1 += 12; 
    if(b.hour.match(/.*pm/)) time2 += 12;
    if (time1 < time2) return -1;
    if (time1 > time2) return 1;
    return 0; 
});

console.log(final);
0 голосов
/ 13 января 2020

Вы можете написать свою собственную функцию сортировки следующим образом:

const times = [
    {hour: '3pm', data:[]},
    {hour: '8am', data:[]},
    {hour: '9am', data:[]},
    {hour: '12pm', data:[]},
    {hour: '12am', data:[]}, // Added for example
    {hour: '2pm', data:[]},
    {hour: '10am', data:[]},
    {hour: '1pm', data:[]} 
];

const toFullHour = hour => {
  let fullHour = parseInt(hour);

  if (fullHour === 12) fullHour = 0;
  if (~hour.indexOf('pm')) fullHour += 12;

  return fullHour;
};
times.sort((a, b) => toFullHour(a.hour) - toFullHour(b.hour));

console.log(times);

Выход:

[
  {
    "hour": "12am",
    "data": []
  },
  {
    "hour": "8am",
    "data": []
  },
  {
    "hour": "9am",
    "data": []
  },
  {
    "hour": "10am",
    "data": []
  },
  {
    "hour": "12pm",
    "data": []
  },
  {
    "hour": "1pm",
    "data": []
  },
  {
    "hour": "2pm",
    "data": []
  },
  {
    "hour": "3pm",
    "data": []
  }
]
0 голосов
/ 13 января 2020

Добавить новое свойство fullhour :

this.array.forEach(x => {
    const time = parseInt(a.hour);
    x.fullhour = a.hour.indexOf('pm') >= 0 ? time + 12 : time;
})

, затем отсортировать по fullhour.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...