Как мне отсортировать этот массив объектов, используя Vanilla или Lodash

Я получил этот объект, возвращенный мне через угловой HttpClient Observable.

{
"jsonrpc": "2.0",
"result": [
{
  "event": {
    "id": "29688772",
    "name": "Demoliner/Middelkoop v Behar/Escobar",
    "countryCode": "AR",
    "timezone": "UTC",
    "openDate": "2020-02-08T20:00:00.000Z"
  },
  "marketCount": 1
},
{
  "event": {
    "id": "29691591",
    "name": "Bemelmans v Pellegrino",
    "countryCode": "FR",
    "timezone": "UTC",
    "openDate": "2020-02-09T09:00:00.000Z"
  },
  "marketCount": 1
},
{
  "event": {
    "id": "29690566",
    "name": "Diez v Emil Ruusuvuori",
    "countryCode": "NL",
    "timezone": "UTC",
    "openDate": "2020-02-08T13:14:00.000Z"
  },
  "marketCount": 1
},
{
  "event": {
    "id": "29690822",
    "name": "Koepfer v J Rodionov",
    "countryCode": "US",
    "timezone": "UTC",
    "openDate": "2020-02-08T18:00:00.000Z"
  },
  "marketCount": 1
},
{
  "event": {
    "id": "29691586",
    "name": "Basic v Vanni",
    "countryCode": "FR",
    "timezone": "UTC",
    "openDate": "2020-02-09T09:00:00.000Z"
  },
  "marketCount": 1
},
{
  "event": {
    "id": "29691596",
    "name": "P Kotov v Mayot",
    "countryCode": "FR",
    "timezone": "UTC",
    "openDate": "2020-02-09T09:00:00.000Z"
  },
  "marketCount": 1
}

Я хочу отсортировать массив по openDate.

Я думал сделать это в подписке вот так

getTennisMatches() {
this.betfairService.getTennisMatches().subscribe((data: any[]) => {
  this.matches = data;
  this.sortedMatches = this.matches.sort((a, b) => (a.result.event.openDate > b.result.event.openDate) ? 1 : -1);
  // OR
  this.sortedMatches = _.sortBy(this.matches.result, o => o.result.event.openDate);
});

}

Оба метода сортировки не работают с ошибками this.matches.sort is not a function для vanilla или Cannot read property 'event' of undefined для lodash

Я думаю, что я должен перебирать события, но я не уверен, что я делаю. Я использую lodash, потому что мне легче понять его синтаксис, но мне не нужно его использовать. Благодарность

Всего 2 ответа


Вместо сортировки объекта matches вы можете отсортировать массив result внутри объекта.

this.matches.result.sort((a, b) => Date.parse(a.event.openDate) - Date.parse(b.event.openDate));

Но обратите внимание, что это также отсортирует оригинальный объект.

Упрощенный пример фрагмента:

let matches = {
result : [
  { id:1001 , event: { openDate : "2020-02-03T20:00:00.000Z" } },
  { id:1002 , event: { openDate : "2020-02-01T20:00:00.000Z" } },
  { id:1003 , event: { openDate : "2020-02-03T20:00:00.000Z" } },
  { id:1004 , event: { openDate : "2020-02-04T20:00:00.000Z" } },
  { id:1005 , event: { openDate : "2020-02-02T20:00:00.000Z" } }
]
};

let sorted = matches.result.sort((a, b) =>  Date.parse(a.event.openDate) - Date.parse(b.event.openDate));

console.log('original object after sort', JSON.stringify(matches));


this.matches.sort is not a function указывает, что ваша переменная this.matches пуста, и вы пытаетесь выполнить итерации по ней, поэтому сначала вам нужно проверить свой ответ на вызов MS. Может быть получение пустого массива.

Тип вместо «любой» будет полезным для вашего предложения, чтобы проверить, если он работает, и получить некоторые данные, но они не имеют ожидаемого формата.

Также можно проверить раздел «Сеть» в Chrome dev tool, чтобы посмотреть ответ.


Есть идеи?

10000