【问题标题】:Go through array of objects to create a new one based on its properties without duplicates遍历对象数组以根据其属性创建一个新对象,而无需重复
【发布时间】:2020-09-03 17:41:46
【问题描述】:

我有一个包含曲棍球比赛的对象数组,我需要通过它们在另一个对象数组中创建记分牌。

我给你举个例子。

我会有这样的数组:

let array = [
           {team1:"Toronto", team2:"Oilers", score1:5, skore:0},
           {team1:"Toronto", team2:"Rangers", score1:3, skore:1},
           {team1:"Toronto", team2:"Penguins", score1:0, skore:1},
           {team1:"Oilers", team2:"Rangers", score1:2, skore:2},
           {team1:"Oilers", team2:"Penguins", score1:2, skore:3},
           {team1:"Rangers", team2:"Penguins", score1:0, skore:0}
           ]

而且我需要一个可以让我得到这样的数组的函数:

let array2 = [
  {Team:"Toronto", Wins:2, Draws:0, Losses:1, ShotGoals:8, RecievedGoals:2},
  {Team:"Oilers", Wins:0, Draws:1, Losses:2, ShotGoals:4, RecievedGoals:10},
  {Team:"Penguins", Wins:1, Draws:1, Losses:2, ShotGoals:2, RecievedGoals:4},
  {Team:"Rangers", Wins:1, Draws:2, Losses:0, ShotGoals:3, RecievedGoals:2},
]

我尝试使用 forEach 遍历数组并推送新的或更改数组 2 中的现有团队,但无法让它工作,因为我正在创建的数组 2 正在改变,随着循环的进行。它还需要是动态的,因此如果第一个数组被扩展等它仍然可以工作,而我现在无法让它工作。

我假设我将不得不使用一些数组方法,但我似乎无法弄清楚是哪一种以及如何使用,因为我对此很陌生。

非常感谢任何帮助。谢谢你。

【问题讨论】:

  • 对使用团队名称作为 groupBy 对象属性进行“groupBy”进行一些研究。然后,您将需要一些逻辑来比较 2 个分数,以将赢/输和平局相加
  • 感谢您的评论。我做了一点谷歌搜索,这看起来和我正在寻找的完全一样。虽然很难说逻辑将如何实现,但我会试一试。干杯。
  • 我尝试了

标签: javascript arrays loops object methods


【解决方案1】:
let array = [
           {team1:"Toronto", team2:"Oilers", score1:5, skore:0},
           {team1:"Toronto", team2:"Rangers", score1:3, skore:1},
           {team1:"Toronto", team2:"Penguins", score1:0, skore:1},
           {team1:"Oilers", team2:"Rangers", score1:2, skore:2},
           {team1:"Oilers", team2:"Penguins", score1:2, skore:3},
           {team1:"Rangers", team2:"Penguins", score1:0, skore:0}
           ]


let result = {};

let addToTeam = (t,w,d,l)=>{
if(result[t] == null)
return result[t] = {team:t,wins:w,draws:d,losses:l}
    result[t].wins+=w
    result[t].draws+=d
    result[t].losses+=l
}

array.forEach(m => {
if(m.score1>m.skore){
    addToTeam(m.team1,1,0,0)
    addToTeam(m.team2,0,0,1)
}else if(m.score1<m.skore){
    addToTeam(m.team1,0,0,1)
    addToTeam(m.team2,1,0,0)
}else{
    addToTeam(m.team1,0,1,0)
    addToTeam(m.team2,0,1,0)
}})

result = Object.values(result)

console.log(result);

结果

[{"team":"Toronto","wins":2,"draws":0,"losses":1},   
{"team":"Oilers","wins":0,"draws":1,"losses":2},    
{"team":"Rangers","wins":0,"draws":2,"losses":1},    
{"team":"Penguins","wins":2,"draws":1,"losses":0}]

【讨论】:

  • 谢谢。我刚刚输入了射门和收到的目标,以与其他事情相同的方式添加,它就像一个魅力。
猜你喜欢
  • 2013-12-22
  • 1970-01-01
  • 1970-01-01
  • 2014-09-28
  • 1970-01-01
  • 2016-01-12
  • 2021-11-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多