Сортировать массив объектов на основе массива - PullRequest
0 голосов
/ 23 сентября 2019

Я бы хотел отсортировать объекты верхнего уровня данного массива по наиболее вложенному значению (то есть «результат») И «GameType».Сортировка по 'gameType' устанавливается пользователем, который вводит массив значений в определенном порядке, например, [201, 202, 249] (длина ввода не фиксирована).'gameType' вне диапазона, заданного пользователем, игнорируется и выдвигается до конца результата.Сортировка по «результату» происходит путем выбора наибольшего значения из доступных результатов.

Вот функция для сортировки результатов:

outcomes => Math.max(...outcomes.sort(({ outcome: a }, { outcome: b }) => a - b).map(({ outcome }) => outcome))

А вот массив:

[
  {
    "eventId": 513221,
    "games": [
      {
        "gameId": 31313404,
        "gameType": 240,
        "outcomes": [
          {
            "outcome": 1.8
          }, {
            "outcome": 21
          }, {
            "outcome": 2
          }
        ]
      }, {
        "gameId": 31313413,
        "gameType": 201,
        "outcomes": [
          {
            "outcome": 2.1
          }, {
            "outcome": 2.6
          }, {
            "outcome": 4.1
          }
        ]
      }
    ]
  }, {
    "eventId": 513216,
    "games": [
      {
        "gameId": 31314456,
        "gameType": 249,
        "outcomes": [
          {
            "outcome": 1.45
          }, {
            "outcome": 40
          }, {
            "outcome": 2.5
          }
        ]
      }, {
        "gameId": 31314475,
        "gameType": 201,
        "outcomes": [
          {
            "outcome": 1.5
          }, {
            "outcome": 4.55
          }, {
            "outcome": 4.75
          }
        ]
      }
    ]
  }, {
    "eventId": 513263,
    "games": [
      {
        "gameId": 31314398,
        "gameType": 241,
        "outcomes": [
          {
            "outcome": 1.52
          }, {
            "outcome": 2.35
          }
        ]
      }, {
        "gameId": 31314423,
        "gameType": 201,
        "outcomes": [
          {
            "outcome": 1.65
          }, {
            "outcome": 3.9
          }, {
            "outcome": 4.25
          }
        ]
      }
    ]
  }, {
    "eventId": 5132631,
    "games": [
      {
        "gameId": 313143981,
        "gameType": 240,
        "outcomes": [
          {
            "outcome": 1.52
          }, {
            "outcome": 30
          }, {
            "outcome": 2.35
          }
        ]
      }, {
        "gameId": 313144231,
        "gameType": 202,
        "outcomes": [
          {
            "outcome": 1.65
          }, {
            "outcome": 3.9
          }
        ]
      }
    ]
  }, {
    "eventId": 5132632,
    "games": [
      {
        "gameId": 313143912,
        "gameType": 298,
        "outcomes": [
          {
            "outcome": 1.57
          }, {
            "outcome": 2.2
          }
        ]
      }, {
        "gameId": 313144232,
        "gameType": 202,
        "outcomes": [
          {
            "outcome": 1.65
          }, {
            "outcome": 4.11
          }
        ]
      }
    ]
  }
]

1 Ответ

0 голосов
/ 23 сентября 2019

Вы можете взять объект в качестве помощника для сортировки.Свойства - это индекс требуемого gameType и значение max outcome для каждой игры.

var data = [{ eventId: 513221, games: [{ gameId: 31313404, gameType: 240, outcomes: [{ outcome: 1.8 }, { outcome: 21 }, { outcome: 2 }] }, { gameId: 31313413, gameType: 201, outcomes: [{ outcome: 2.1 }, { outcome: 2.6 }, { outcome: 4.1 }] }] }, { eventId: 513216, games: [{ gameId: 31314456, gameType: 249, outcomes: [{ outcome: 1.45 }, { outcome: 40 }, { outcome: 2.5 }] }, { gameId: 31314475, gameType: 201, outcomes: [{ outcome: 1.5 }, { outcome: 4.55 }, { outcome: 4.75 }] }] }, { eventId: 513263, games: [{ gameId: 31314398, gameType: 241, outcomes: [{ outcome: 1.52 }, { outcome: 2.35 }] }, { gameId: 31314423, gameType: 201, outcomes: [{ outcome: 1.65 }, { outcome: 3.9 }, { outcome: 4.25 }] }] }, { eventId: 5132631, games: [{ gameId: 313143981, gameType: 240, outcomes: [{ outcome: 1.52 }, { outcome: 30 }, { outcome: 2.35 }] }, { gameId: 313144231, gameType: 202, outcomes: [{ outcome: 1.65 }, { outcome: 3.9 }] }] }, { eventId: 5132632, games: [{ gameId: 313143912, gameType: 298, outcomes: [{ outcome: 1.57 }, { outcome: 2.2 }] }, { gameId: 313144232, gameType: 202, outcomes: [{ outcome: 1.65 }, { outcome: 4.11 }] }] }],
    input = [201, 202],
    order = data.reduce((o, { eventId, games }) => {
        o[eventId] = games
            .map(({ gameType, outcomes }) => ({ index: input.indexOf(gameType), max: Math.max(...outcomes.map(({ outcome }) => outcome)) }))
            .filter(({ index }) => index !== -1)
            .reduce((a, b) => a.index < b.index ? a : b, { index: Infinity, max: -Infinity });
        return o;
    }, {});

data.sort((a, b) =>
    order[a.eventId].index - order[b.eventId].index ||
    order[b.eventId].max - order[a.eventId].max
);

console.log(data);
.as-console-wrapper { max-height: 100% !important; top: 0; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...