Сравните многомерные массивы и найдите минимальные / максимальные значения в JavaScript - PullRequest
0 голосов
/ 08 апреля 2020

В моей игре JavaScript я сохраняю результаты в многомерном массиве (в локальном хранилище).

Я сохраняю themeID, идентификатор темы, в которую играли. Кроме того, я сохраняю настройки игры (pieces и shapesSquare) и duration игры.

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

Критическим моментом для меня является сравнение только различные настройки, а затем найдите самое низкое значение продолжительности. Мне не нужна только самая низкая длительность всего массива, но мне нужно найти ее для каждой настройки. Это значит, что мне нужно выяснить, где themeID, pieces и shapesSquare идентичны, чтобы сравнить результаты. Если pieces или shapesSquare различны, то для этого themeID.

это должен быть другой рекорд. Идеальным результатом для меня будет массив, в котором у меня есть для каждой темы и установка «лучший» "Score.

Массив выглядит так:

let scores = [
  {
    "themeID": 1,
    "pieces": 10,
    "shapesSquare": true,
    "duration": "00:01:00"
  },
  {
    "themeID": 1,
    "pieces": 10,
    "shapesSquare": true,
    "duration": "00:01:30"
  },
  {
    "themeID": 4,
    "pieces": 20,
    "shapesSquare": false,
    "duration": "00:04:00"
  },
  {
    "themeID": 4,
    "pieces": 30,
    "shapesSquare": true,
    "duration": "00:03:20"
  }
]

Кстати, я довольно гибок с массивом scores, потому что я создаю его сам, так что если у вас есть какие-либо предложения При изменении структуры (чтобы упростить повторение), не стесняйтесь сказать мне.

Заранее благодарю за любую помощь!

1 Ответ

0 голосов
/ 08 апреля 2020

Я бы попробовал что-то вроде:

const minMaxDurationMap = new Map();
for (const score of scores) {
    const key = JSON.stringify([score.themeID,score.pieces,score.shapesSquare]);
    const minMax = minMaxDurationMap.get(key);
    if (minMax) {
        if (score.duration < minMax.min) minMax.min = score.duration;
        else if (score.duration > minMax.max) minMax.max = score.duration;
    } else {
        minMaxDurationMap.set(key, { min: score.duration, max: score.duration });
    }
}

Кроме того, я думаю, что вы должны хранить свою продолжительность в количестве (секундах или миллисекундах) вместо строки.

I меня не устраивает генерация ключей моего решения, но я не смог придумать ничего лучшего.

...