我有一组5个人的数据。数据是:"#ofKeys","首选板条箱","Round1Results","Round2Results","Round2Results">
我想要的是数据以某种形式的 2D 数组形式出现,以便它涵盖所有 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]];
当您询问更多轮次结果时,您可以将索引 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; }
您可以映射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);
对我来说最有意义的是将数据映射到每个玩家的对象中,如下所示:
此解决方案利用:
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);