【问题标题】:Calculating avarage/min/max of an array计算数组的平均/最小值/最大值
【发布时间】:2017-05-26 16:00:44
【问题描述】:

我有一组 5 个人的数据。数据如下: "#ofKeys","PreferedCrate","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]];

【问题讨论】:

  • playerData 中的每个数组是否代表不同玩家的数据?还是playerData 单人进行多组 3 轮?
  • 另外,这些可能会有所帮助:Min = Math.min(num1, num2, ...etc), Max = Math.max(num1, num2, ...etc)
  • @mhodges 是的,playerdata 中的每个数组都是不同的玩家。所以第一个数组是玩家 1、第二玩家 2 等的结果。
  • 我如何访问这个数组的元素?什么是合适的语法
  • 查看我的答案,看看如何完成

标签: javascript arrays average minmax


【解决方案1】:

当您询问更多回合结果时,您可以将索引 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; }

【讨论】:

    【解决方案2】:

    您可以映射您的 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);

    【讨论】:

    • 对此我有 2 个问题。首先是,如果我要添加更多参数,例如更多回合或更多玩家,我需要修改哪些代码行。我的第二个问题是,我如何记录单个玩家的平均值,如果我只需要玩家 1 的平均值,我该如何获得?
    • 我已经编辑了我的答案以考虑可变数量的结果并打印单个玩家的统计数据。
    【解决方案3】:

    (对我而言)最有意义的是将数据映射到每个玩家的对象中,如下所示:

    此解决方案利用:

    Array.prototype.map()(用于映射到对象数组)

    Array.prototype.reduce()(用于对轮数据进行一般求和)

    ES6 Spread Syntax(用于收集/传播回合数据)

    ES6 Destructuring Assignment(方便将玩家数据提取到局部变量中)

    ES6 Find(用于通过属性值从数组中提取单个对象)

    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);

    【讨论】:

    • 对此我有 2 个问题。首先是,如果我要添加更多参数,例如更多回合或更多玩家,我需要修改哪些代码行。我的第二个问题是,我如何记录单个玩家的平均值,如果我只需要玩家 1 的平均值,我该如何获得?
    • @evilgenious448 对于更多玩家来说,什么都不需要改变。对于更多回合,我将稍微修改代码以适应这一点(实际上代码更少),我将添加代码以获得单个玩家的平均值。
    • @evilgenious448 已更新。看看是不是你需要的!
    猜你喜欢
    • 1970-01-01
    • 2016-11-04
    • 1970-01-01
    • 1970-01-01
    • 2021-01-25
    • 1970-01-01
    • 2016-08-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多