希望你今天过得愉快。正如标题所说,我正在尝试计算几个对象,以便制作一个具有平均值的新对象。
这是模式
export class stats{
assists: number
causedEarlySurrender: boolean
champLevel: number
combatPlayerScore: number
damageDealtToObjectives: number
damageDealtToTurrets: number
damageSelfMitigated: number
deaths: number
doubleKills: number
earlySurrenderAccomplice: boolean
firstBloodAssist: boolean
firstBloodKill: boolean
firstInhibitorAssist: boolean
firstInhibitorKill: boolean
firstTowerAssist: boolean
firstTowerKill: boolean
gameEndedInEarlySurrender: boolean
gameEndedInSurrender: boolean
goldEarned: number
goldSpent: number
inhibitorKills: number
item0: number
item1: number
item2: number
item3: number
item4: number
item5: number
item6: number
killingSprees: number
kills: number
largestCriticalStrike: number
largestKillingSpree: number
largestMultiKill: number
longestTimeSpentLiving: number
magicDamageDealt: number
magicDamageDealtToChampions: number
magicalDamageTaken: number
neutralMinionsKilled: number
neutralMinionsKilledEnemyJungle: number
neutralMinionsKilledTeamJungle: number
objectivePlayerScore: number
participantId: number
pentaKills: number
perk0: number
perk0Var1: number
perk0Var2: number
perk0Var3: number
perk1: number
perk1Var1: number
perk1Var2: number
perk1Var3: number
perk2: number
perk2Var1: number
perk2Var2: number
perk2Var3: number
perk3: number
perk3Var1: number
perk3Var2: number
perk3Var3: number
perk4: number
perk4Var1: number
perk4Var2: number
perk4Var3: number
perk5: number
perk5Var1: number
perk5Var2: number
perk5Var3: number
perkPrimaryStyle: number
perkSubStyle: number
physicalDamageDealt: number
physicalDamageDealtToChampions: number
physicalDamageTaken: number
playerScore0: number
playerScore1: number
playerScore2: number
playerScore3: number
playerScore4: number
playerScore5: number
playerScore6: number
playerScore7: number
playerScore8: number
playerScore9: number
quadraKills: number
sightWardsBoughtInGame: number
teamEarlySurrendered: boolean
timeCCingOthers: number
totalDamageDealt: number
totalDamageDealtToChampions: number
totalDamageTaken: number
totalHeal: number
totalMinionsKilled: number
totalPlayerScore: number
totalScoreRank: number
totalTimeCrowdControlDealt: number
totalUnitsHealed: number
tripleKills: number
trueDamageDealt: number
trueDamageDealtToChampions: number
trueDamageTaken: number
turretKills: number
unrealKills: number
visionScore: number
visionWardsBoughtInGame: number
wardsKilled: number
wardsPlaced: number
win: boolean
}
所以我在一个对象数组中得到这些数据,就像这样。
0: {assists: 0, causedEarlySurrender: false, champLevel: 18, combatPlayerScore: 0, damageDealtToObjectives: 60241, …}
1: {assists: 2, causedEarlySurrender: false, champLevel: 18, combatPlayerScore: 0, damageDealtToObjectives: 7592, …}
2: {assists: 0, causedEarlySurrender: false, champLevel: 16, combatPlayerScore: 0, damageDealtToObjectives: 8982, …}
我尝试了一些方法,但我找不到一种自动完成的方法,这意味着不必键入每个键名。
这就是我目前所拥有的:
meanStats(){
let iterator = 0;
this.stats.forEach((m, i, array)=>{
iterator ++;
for (let [key, value] of Object.entries(m)) {
console.log(key, value);
switch (value) {
case Boolean:
if(key == "win"){
this.wins += value//if true should compute as 1 and if its not should be 0
}
if(key == "gameEndedInSurrender"){
this.surrenders += value
}
else{
break
}
break;
case Number://meanStat is the new object
this.meanStat.key += value
break;
default:
break;
}
}
});
}
我们的想法是访问每个注释记号和值,检查它是布尔值还是数字(如果是布尔值,则会缺少很多情况(,并在新对象的正确键上求和该值。之后,用迭代器将所有值除以,我应该得到一个平均值。不起作用,因为键不是对象的已知值。
如有任何帮助,我们将不胜感激。一直以来都非常感谢。
您可以尝试这样的方法。但您需要单独处理布尔值。
const obj = {};
let a= [
{assists: 0, champLevel: 18, combatPlayerScore: 0, damageDealtToObjectives: 60241},
{assists: 2, champLevel: 18, combatPlayerScore: 0, damageDealtToObjectives: 60241},
{assists: 4, champLevel: 18, combatPlayerScore: 0, damageDealtToObjectives: 60241}
]
a.forEach( item => {
Object.keys(item).forEach(key => {
if (obj[key]) {
obj[key]+= item[key];
} else {
obj[key]= item[key];
}
});
});
Object.keys(obj).forEach((key) => obj[key] = obj[key]/a.length);
我正在发布结果,它可能对你们中的一些人有用。我仍然需要单独处理布尔值,所以它不是100%完整的。有些值不需要求平均值,另一些则使用最大值,所以事情变得有些复杂。我能够使用我的对象模式,所以这很好。
这是代码:
meanStats(){
this.stats.forEach((m, i, array)=>{
for (let [key, value] of Object.entries(m)) {
//setting everything to default
if(typeof(this.meanStat[key])=="undefined" && typeof(value)=="number"){
this.meanStat[key] = 0
}else if(typeof(this.meanStat[key])=="undefined" && typeof(value)=="boolean"){
this.meanStat[key] = false
//filtering by number types
}
if (typeof(value) == "number"){
let aux: number = this.meanStat[key]
if (key == "largestCriticalStrike" || key == "largestKillingSpree"||key == "largestMultiKill"){
if(value > this.meanStat[key]){
this.meanStat[key] = value
}
}else if (key == "doubleKills"|| key=="tripleKills"|| key == "quadraKills" || key=="pentakills"){
switch (key) {
//decided to make separate variables for this ones and also to have the average values.
case "doubleKills":
this.doublekills +=value
aux+=value
this.meanStat[key] = aux
break;
case "tripleKills":
this.triplekills +=value
aux+=value
this.meanStat[key] = aux
break;
case "quadraKills":
this.quadrakills +=value
aux+=value
this.meanStat[key] = aux
break;
case "pentakills":
this.pentakills +=value
aux+=value
this.meanStat[key] = aux
break;
default:
break;
}
}else{
aux+=value;
this.meanStat[key] = aux;
}
}else{
switch (key) {
//need to handle other booleans, have not done that yet that's why is only one case
case "win":
if(value == true){
this.wins ++
}
break;
default:
break;
}
}
}
});
//average every number except largestCriticalStrike
Object.keys(this.meanStat).forEach((key) => {
if (typeof(this.meanStat[key])== "number"){
if(key != "largestCriticalStrike" ){
this.meanStat[key] = this.meanStat[key]/this.stats.length
}
}
})
console.log(this.meanStat)
console.log(this.wins)
}
}
代码是有效的,但如果有人知道如何以更好的方式做到这一点,请随时发布您自己的答案。祝你今天过得愉快。哦,感谢@Arun Mohan的帮助。