将有角度的项目和值合并到一个新的同类对象中(typescript)



希望你今天过得愉快。正如标题所说,我正在尝试计算几个对象,以便制作一个具有平均值的新对象。

这是模式

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的帮助。

最新更新