Koala7
Koala7

Reputation: 1404

Calculate the greater value between objects in different arrays

I have a score array containing two objects: Liga and Premier. These 2 objects are an array of a list of teams.

I was able to define the greater string when score was previously a single array of objects.

This is the demo i have reproduced where the comparison works fine.

This is the code calculating the higher value comparing the 2 objects.

const maxAverage = teams => {
  return teams.map(team => {
      return {
          team:team, 
          avg: getAverage(team)
      }
  }).reduce((a,b)=>a.avg>b.avg?a:b).team
}


<p>Stronger Team:{maxAverage([this.state.homeCity,this.state.awayCity])</p>

The problem now is that now score is an array of the 2 object as i said and i am trying to change my function in something like

const maxAverage = (league, teams) => {
  return teams.map(team => {
      return {
          team:team,
          avg: getAverage(league,team)
      }
  }).reduce((a,b)=>a.avg>b.avg?a:b).team
}

I am not able to pass to my function maxAverage the parameter of one of the two leagues selected and then the 2 objects ( teams ) i want to compare.

i want to do something like this:

<p>Stronger Team:{maxAverage([this.state.selectedLeague], this.state.selectedHomeTeam,this.state.selectedAwayTeam])}

This is the other demo i have reproduced with the current situation.

Upvotes: 0

Views: 241

Answers (4)

mdeforestbrown
mdeforestbrown

Reputation: 49

I looked at your second demo and I think you have two choices to get the correct team selected and you can reuse your previous getAverage method for both. Either

  const maxAverage = (league, teams) => {
  const currentLeague = [scores][0][league]
  return teams
    .map(team => {
      return {
        team: team,
        avg: getAverage(currentLeague, team)
      };
    })
    .reduce((a, b) => (a.avg > b.avg ? a : b)).team;
};

alternatively you could keep the original maxAverage code and change how you implement the league value eg.

            <p>           
              Stronger Team:
              {maxAverage(scores[this.state.selectedLeague], [
                this.state.selectedHomeTeam,
                this.state.selectedAwayTeam
              ])}
            </p>

Upvotes: 1

nogibator2000
nogibator2000

Reputation: 41

What is a problem?

const scores = {'liga':[
  { day: "1", Barcelona: 1, Real: 3, Valencia: 0 },
  { day: "2", Barcelona: 4, Real: 6, Valencia: 3 },
  { day: "3", Barcelona: 7, Real: 7, Valencia: 3 },
  { day: "4", Barcelona: 7, Real: 8, Valencia: 6 }
], 'primier':[
  { day: "1", Barcelona: 1, Real: 3, Valencia: 0 },
  { day: "2", Barcelona: 4, Real: 6, Valencia: 3 },
  { day: "3", Barcelona: 7, Real: 7, Valencia: 3 },
  { day: "4", Barcelona: 7, Real: 8, Valencia: 6 }]};
const getAverage = (type, team) => {
  if (isNaN(scores[type][0][team])) return null;

  return scores[type].map(x => x[team]).reduce((a, c) => a + c) / scores[type].length;
};
getAverage('liga',this.state.homeCity);

src: https://codesandbox.io/s/recharts-examples-d9qy0

Upvotes: 0

Aprillion
Aprillion

Reputation: 22322

Given the signature const maxAverage = (league, teams) => ..., following code would match the expected arguments (not sure about the business logic though):

maxAverage(
  this.state.selectedLeague,
  [this.state.selectedHomeTeam, this.state.selectedAwayTeam]
)

Upvotes: 1

perusopersonale
perusopersonale

Reputation: 896

Why not simply extract team when selected, save in the state and use the same method used before?

Upvotes: 0

Related Questions