简体   繁体   English

Angular 项目总和值转换为同类的新 object(打字稿)

[英]Angular project sum values into a new object of the same kind(typescript)

hope you're having a good day.希望你今天过得愉快。 As the title says, i'm trying calculate several objects in order to make a new one with the average values.正如标题所说,我正在尝试计算几个对象,以便用平均值制作一个新对象。

This is the schema这是架构

 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 }

So i get this data in an array of objects, like this.所以我在一个对象数组中获取这些数据,就像这样。

 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, …}

I was trying a few things, but i can't find a way of doing this automatically, meaning not to have to type every key name.我正在尝试一些事情,但我找不到自动执行此操作的方法,这意味着不必键入每个键名。

This is what i have so far:这是我到目前为止所拥有的:

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

The idea would be to access each keyname and value, check if its a boolean or a number,(lots of cases missing in case it's a boolean) sum that value on the correct key of the new object.这个想法是访问每个键名和值,检查它是 boolean 还是数字,(如果它是布尔值,很多情况下会丢失)对新 object 的正确键上的值求和。 After that divide all values by the iterator and i should have an average.之后将所有值除以迭代器,我应该有一个平均值。 Does not work, because key is not a known value of the object.不起作用,因为 key 不是 object 的已知值。

Any help would be appreciated.任何帮助,将不胜感激。 As allways thanks a lot.一如既往,非常感谢。

You can try something like this.你可以尝试这样的事情。 But you need to handle boolean separately.但需要单独处理 boolean。

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

I'm posting the result, it might be usefull to some of you.我正在发布结果,它可能对你们中的一些人有用。 I still need to handle booleans separately, so it's not 100% complete.我仍然需要单独处理布尔值,所以它不是 100% 完成的。 Some of the values don't need to be averaged, others use a max value, so things got somewhat complex.有些值不需要平均,有些使用最大值,所以事情变得有些复杂。 I was able to use my object schema, so that's good.我能够使用我的 object 架构,这很好。

Here's the code:这是代码:

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

Code works, but if someone knows how to do this in a better way, feel free to post your own answer.代码有效,但如果有人知道如何以更好的方式做到这一点,请随时发布您自己的答案。 Have a good day.祝你有美好的一天。 Oh, and thx to @Arun Mohan for it's help.哦,感谢@Arun Mohan 的帮助。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM