Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

118
Visualizações
Javascript React sorting complex array

I'm trying to sort a complex array. This array is grabbed with GraphQL from my headless CMS as follows:

query MyQuery {
    teams {
        id
        name
        match {
            teams {
                name
            }
            homePoints
            awayPoints
            date
            trophy
        }
    }
}

Now I'm mapping through all the teams and calculated the total points of a team (depending whether a team is playing home or away) with the following:

<Tbody>
    {!fetching && data.teams.map((team, i) => {
        const points = team.match.map(match => match.teams[0].name === team.name ? match.homePoints : match.awayPoints).reduce((a, b) => a + b, 0)

        return (
            <Tr key={team.id}>
                <Td>{i + 1}</Td>
                <Td>{team.name}</Td>
                <Td>{points}</Td>
            </Tr>
        )
    })}
</Tbody>

The result is displayed well within a table, except the following: it is not sorted. The team with the highest amount of points should be on the top of the table. How to solve this?

about 4 years ago · Juan Pablo Isaza
2 Respostas
Responde à pergunta

0

Oh i see, you basically want to sort the array. However you didn't prepare the array ahead of the time, that's the trouble you get yourself into.

To resolve this, let's prepare the array first.


  // this the the teams with points
  // you did good job of processing it
  let teams = data.teams.map(...)

  // sort the array
  // please test the sorting order
  teams.sort(function(a, b) {
    return Math.sign(b.point - a.point)
  })

  // this is the place for render
  return (
    <Tbody>
      {teams.map(team => (
        <Tr key={team.id}>
          ...
        </Tr>
      )}
    <Tbody>
  )
  

A general good practice is that, don't bring any logic code into the render layer. In React, it's about the line of the return, if you can put most of the logic above that line, it'll help you refactor your render later on.

about 4 years ago · Juan Pablo Isaza Relatório

0

For a clean code, create a few helper functions before the render / return part. It should looks something like this:

// Util functions outside component
const withPoints = (team, i) => {
   const points = team.match.map(match => 
       match.teams[0].name === team.name ? match.homePoints : 
       match.awayPoints).reduce((a, b) => a + b, 0)
   return {team, points}
};

const byPoints = (a, b) => b.points - a.points

// My component
const MyComponent = ({fetching, data}) => {

// temporary assignment in component body to make the JSX part cleaner
const teams = fetching ? 
    data.teams
      .map(withPoints)
      .sort(byPoints)
    : null

return <Tbody>
             {teams && teams.map((t, i) => (
                    <Tr key={t.team.id}>
                        <Td>{i + 1}</Td>
                        <Td>{t.team.name}</Td>
                        <Td>{t.points}</Td>
                    </Tr>
                ))}
      </Tbody>
}
about 4 years ago · Juan Pablo Isaza Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda