Сортировать список дат по времени в Javascript - PullRequest
0 голосов
/ 05 мая 2018

У меня есть массив объектов, подобных этому:

[
 {
  _id: 1
  date: '2018-05-04T12:28:00-07:00' //12:28pm
 },
 {
  _id: 2
  date: '2018-04-29T08:24:00-07:00' //8:24am
 },
 {
  _id: 3
  date: '2018-05-04T10:29:00-07:00' //10:29am
 }

Теперь я хочу отсортировать этот массив только по "ВРЕМЕНИ" независимо от даты.

Сортированный массив должен выглядеть так:

[
 {
  _id: 2
  date: '2018-04-29T08:24:00-07:00' //8:24am
 },
 {
  _id: 3
  date: '2018-05-04T10:29:00-07:00' //10:29am
 },
 {
  _id: 1
  date: '2018-05-04T12:28:00-07:00' //12:28pm
 }
]

Как мне написать этот код в Javascript?

Я пытался:

sorted.sort((a, b) => {
  return new Date(a.start_ts).getUTCHours() - new Date(b.start_ts).getUTCHours()
})

но, похоже, выдает мне ошибку: «не может метод сортировки не может быть вызван для неизменной структуры данных».

Ответы [ 3 ]

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

Учитывая сортировать этот массив только по "ВРЕМЕНИ" независимо от даты ,

const input = [{
    _id: 1,
    date: "2018-05-04T12:28:00-07:00"
  },
  {
    _id: 2,
    date: "2018-04-29T08:24:00-07:00"
  },
  {
    _id: 3,
    date: "2018-05-04T10:29:00-07:00"
  }
];
input.sort((a,b) => {
  return getDate(a) - getDate(b)
});

function getDate(i) {
  let temp = new Date(i.date);
  let currentDate = new Date();
  temp.setUTCFullYear(currentDate.getUTCFullYear(),
    currentDate.getUTCMonth(),
    currentDate.getUTCDate());
  return temp;
}
console.log(input);

setUTCFullYear () .

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

Ваш код не может работать, поскольку сортируемые объекты не имеют свойства start_ts . Это также помогает, если вы публикуете правильный javascript.

Учитывая формат компонента времени, объекты можно сортировать как строки, используя свойство date и localeCompare :

var data = [
   {_id: 1, date: '2018-05-04T12:28:00-07:00'},
   {_id: 2, date: '2018-04-29T08:24:00-07:00'},
   {_id: 3, date: '2018-05-04T10:29:00-07:00'}
];

data.sort((a, b) => a.date.substr(11,8).localeCompare(b.date.substr(11,8)));

console.log(data);
0 голосов
/ 05 мая 2018

Не нужно связываться с датами, просто извлеките часы / минуты / секунды каждой строки и отсортируйте соответственно:

const arr = [{
    _id: 1,
    date: '2018-05-04T12:28:00-07:00' //12:28pm
  },
  {
    _id: 2,
    date: '2018-04-29T08:24:00-07:00' //8:24am
  },
  {
    _id: 3,
    date: '2018-05-04T10:29:00-07:00' //10:29am
  }
];
const hmsVal = str => {
  const [,h, m, s] = str.match(/(\d\d):(\d\d):(\d\d)/);
  return Number(h) * 3600 + Number(m) * 60 + Number(s);
};
arr.sort((a, b) => hmsVal(a.date) - hmsVal(b.date));
console.log(arr);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...