Вычисление среднего/мин/макс массива

У меня есть набор данных на 5 человек. Данные идут: "#ofKeys", "PreferredCrate", "Round1Results", "Round2Results", "Round2Results"

Я хотел бы, чтобы данные были в какой-то форме двумерного массива, чтобы он охватывал всю информацию обо всех 5 игроках.

Затем я хотел бы, чтобы данные регистрировали среднее значение 3 раундов для каждого игрока, а также лучший и худший результат, который получил каждый игрок.

Я не совсем уверен, как подойти к этому, поэтому любая помощь будет оценена.

До сих пор все, что я действительно сделал, это сделал небольшой массив элементов следующим образом:

var playerdata = [[2, Assault, 1,1,10],
                  [0, Support, 3,2,11],
                  [1, Assault, 7,12,1],
                  [0, Assault, 5,9,14],
                  [0, Assault, 11,17,18]];

person evilgenious448    schedule 26.05.2017    source источник
comment
каждый массив в playerData представляет данные для другого игрока? или это playerData для нескольких сетов по 3 раунда одним игроком?   -  person mhodges    schedule 26.05.2017
comment
Кроме того, это может быть полезно: Min = Math.min(num1, num2, ...etc), Max = Math.max(num1, num2, ...etc)   -  person mhodges    schedule 26.05.2017
comment
@mhodges да, каждый массив в playerdata — это отдельный игрок. Таким образом, первый массив — это результаты игрока 1, второго игрока 2 и т. д.   -  person evilgenious448    schedule 26.05.2017
comment
Как мне получить доступ к элементам этого массива? Какой правильный синтаксис   -  person evilgenious448    schedule 26.05.2017
comment
Посмотрите мой ответ, чтобы узнать, как это можно сделать   -  person mhodges    schedule 26.05.2017


Ответы (3)


Вы можете сопоставить свой массив playerdata и рассчитать среднее/лучшее/худшее для каждого игрока:

var playerdata = [[2, 'Assault', 1,1,10],
                  [0, 'Support', 3,2,11],
                  [1, 'Assault', 7,12,1],
                  [0, 'Assault', 5,9,14],
                  [0, 'Assault', 11,17,18]];
                  
var calculated = playerdata.map((player) => {
  const rounds = player.slice(2);
  
  return {
    player,
    average: average(rounds),
    best: Math.max(...rounds),
    worst: Math.min(...rounds)
  };
});

function average(numbers) {
  return numbers.reduce((a, b) => a + b, 0) / numbers.length;
}

console.log(calculated);

console.log('Player 1 average', calculated[0].average);

person SimpleJ    schedule 26.05.2017
comment
У меня есть 2 вопроса по этому поводу. Во-первых, если бы я добавил больше параметров, например, больше раундов или больше игроков, какие строки кода мне нужно было бы изменить. Мой второй вопрос: как мне регистрировать средние значения отдельных игроков, например, если мне нужно только среднее значение игрока 1, как мне его получить? - person evilgenious448; 26.05.2017
comment
Я отредактировал свой ответ, чтобы учесть переменное количество результатов и распечатать статистику отдельного игрока. - person SimpleJ; 26.05.2017

Пока вы спрашивали о дополнительных результатах раундов, вы могли бы рассматривать массив из индекса 2 как данные для раундов.

var playerdata = [[2, 'Assault', 1, 1, 10], [0, 'Support', 3, 2, 11], [1, 'Assault', 7, 12, 1], [0, 'Assault', 5, 9, 14], [0, 'Assault', 11, 17, 18]],
    result = playerdata.map(player => {
        const data = player.slice(2);
        return {
            player,
            average: data.reduce((a, b) => a + b) / data.length,
            best: Math.max(...data),
            worst: Math.min(...data)
        };
  });

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

person Nina Scholz    schedule 26.05.2017

Что имеет наибольший смысл (для меня), так это сопоставить данные с объектами для каждого игрока, например так:

В этом решении используются:

Array.prototype.map() ( Для отображения в массив объектов)

Array.prototype.reduce()(для суммирования раундов данные в общем)

Синтаксис распространения ES6 (для сбора/распространения округляет данные)

Назначение деструктурирования ES6 (для простого извлечения проигрывателя данные в локальные переменные)

Поиск ES6 (Для извлечения одного объекта из массива по значению свойства)

var playerdata = [[2, "Assault", 1,1,10],
                  [0, "Support", 3,2,11],
                  [1, "Assault", 7,12,1],
                  [0, "Assault", 5,9,14],
                  [0, "Assault", 11,17,18]];
                  
var mapped = playerdata.map(function (arr, index) {
    // Extract player data from array through Destructuring
    // Same as var NumberOfKeys = arr[0], PreferredCrate = arr[1], etc.
    // gather the rest of the arr elements as rounds data
    var [NumberOfKeys, PreferedCrate, ...rounds] = arr;
    
    // return an object with the data we want back
    return {
        PlayerName: "Player " + (index + 1),
        NumberOfKeys,
        PreferedCrate,
        NumberOfRounds: rounds.length,
        BestResult: Math.max(...rounds),
        WorstResult: Math.min(...rounds),
        Average: rounds.reduce((total, round) => total + round) / 3
    };
});

function getPlayerAverage(playerName, data) {
  // find a player by PlayerName (can be done with any property on the player object)
  var playerData = data.find(player => playerName === player.PlayerName);
  // if player is found, return the average, else return "N/A"
  return playerData ? playerData.Average : "N/A";
}
console.log("Player 1 average: ", getPlayerAverage("Player 1", mapped));
console.log("Player 99 average: ", getPlayerAverage("Player 99", mapped));
console.log("--- mapped data ---");
console.log(mapped);

person mhodges    schedule 26.05.2017
comment
У меня есть 2 вопроса по этому поводу. Во-первых, если бы я добавил больше параметров, например, больше раундов или больше игроков, какие строки кода мне нужно было бы изменить. Мой второй вопрос: как мне регистрировать средние значения отдельных игроков, например, если мне нужно только среднее значение игрока 1, как мне его получить? - person evilgenious448; 26.05.2017
comment
@evilgenious448 Для большего количества игроков ничего менять не нужно. Для большего количества раундов я немного изменю код, чтобы приспособиться к этому (на самом деле кода меньше), и я добавлю код, чтобы получить среднее значение одного игрока. - person mhodges; 26.05.2017
comment
@evilgenious448 Обновлено. Взгляните, чтобы увидеть, если это то, что вам нужно! - person mhodges; 26.05.2017