Angular8:按小时排列数组序列

Angular 8: Arrange array sequences by hour

我有一个像

这样的数组
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 点等。 有办法吗?

你试过了吗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);

您可以像@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;
    });

添加新的 属性 fullhour:

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

然后按 fullhour.

排序

您可以像这样编写自己的排序函数:

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": []
  }
]