Как мне отсортировать этот массив объектов, используя Vanilla или Lodash - PullRequest
1 голос
/ 08 февраля 2020

У меня есть этот объект, возвращенный мне через angular Наблюдаемый HttpClient.

{
"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 для ванили или Cannot read property 'event' of undefined для loda sh

Я думаю, что я приходится перебирать события, но я не уверен, что делаю. Я использую loda sh, потому что мне проще понять его синтаксис, но мне не нужно его использовать. Спасибо

Ответы [ 2 ]

1 голос
/ 08 февраля 2020

Вместо сортировки объекта 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));
0 голосов
/ 08 февраля 2020

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

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

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

...