Angular 将总和值投影到新的 object 同类(打字稿)中

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

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

这是架构

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
}

所以我将这些数据放在 object 的数组中,就像这样。

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

    
    }

我们的想法是访问每个键名和值,检查它是布尔值还是数字,(如果是布尔值,则缺少很多情况)在新 [=47= 的正确键上对该值求和].之后将所有值除以迭代器,我应该得到一个平均值。不起作用,因为键不是 object.

的已知值

如有任何帮助,我们将不胜感激。一如既往,非常感谢。

你可以尝试这样的事情。但是你需要单独处理布尔值。

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

我正在 post 查看结果,它可能对你们中的某些人有用。 我仍然需要单独处理布尔值,所以还没有 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)   
    } 
  
}

代码有效,但如果有人知道如何以更好的方式做到这一点,请随时 post 您自己的答案。祝你有美好的一天。 哦,感谢@Arun Mohan 的帮助。