Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

83
Vistas
Reduzca la matriz de resultados a una matriz de objetos con sumas e identificación de usuario

Estoy intentando tomar una serie de resultados y reducirlos a una sola matriz.

Los datos son:

 const data = [ { profileid: '1', points: 25, winner: true }, { profileid: '2', points: 15, winner: false }, { profileid: '3', points: 18, winner: false }, { profileid: '1', points: 15, winner: true }, { profileid: '2', points: 18, winner: false }, { profileid: '3', points: 25, winner: false }, ]

Estoy intentando resumir todos los puntos por ID de usuario (lo he logrado) y también resumir la cantidad de veces que el winner === true en cada objeto

Resultados previstos

 [ { profileid: '1', points: 40, wins: 1 }, { profileid: '2', points: 33, wins: 0 }, { profileid: '3', points: 43, wins: 1 }, ]

Actualmente no puedo contar la suma de resultados "verdaderos" en cada objeto. Además, estoy devolviendo un objeto en lugar de una matriz.

Retazo

 const data = [ { profileid: '1', points: 25, winner: true }, { profileid: '2', points: 15, winner: false }, { profileid: '3', points: 18, winner: false }, { profileid: '1', points: 15, winner: false }, { profileid: '2', points: 18, winner: false }, { profileid: '3', points: 25, winner: true }, ] const result = data.reduce((acc, cur) => ({ ...acc, [cur.profileid]: { profileid: cur.profileid, points: cur.points + (acc[cur.profileid] ? acc[cur.profileid].points : 0), wins: cur.winner ? acc[cur.profile] ? acc[cur.profile].wins + 1 : 0 : acc[cur.profile] ? acc[cur.profile].wins : 0, }, }), [] ) console.log(result)

about 4 years ago · Juan Pablo Isaza
2 Respuestas
Responde la pregunta

0

Aplicar la misma lógica para los points puede dar algo como:

 wins: cur.winner ? ((acc[cur.profileid]?.wins || 0) + 1) : (acc[cur.profileid]?.wins || 0),

¿Empezamos comprobando si el winner actual es true

  • Si es así, agregue 1 ( || 0 ) por primera vez donde las wins no existen
  • Si no, simplemente use acc[cur.profileid]?.wins (también una alternativa si la primera vez es false )

 const data = [ { profileid: '1', points: 25, winner: true }, { profileid: '2', points: 15, winner: false }, { profileid: '3', points: 18, winner: false }, { profileid: '1', points: 15, winner: false }, { profileid: '2', points: 18, winner: false }, { profileid: '3', points: 25, winner: true }, ] const result = data.reduce((acc, cur) => ({ ...acc, [cur.profileid]: { wins: cur.winner ? ((acc[cur.profileid]?.wins || 0) + 1) : (acc[cur.profileid]?.wins || 0), profileid: cur.profileid, points: cur.points + (acc[cur.profileid] ? acc[cur.profileid].points : 0), }, }), [] ) console.log(result)


Dicho esto, personalmente prefiero un simple for y un solo if para obtener un código más legible:

Por favor considere este ejemplo:

  • Crear objeto de result vacío
  • Bucle sobre cada obj en la matriz de data
  • Cree obj vacío en data si es necesario
  • Sube los points y wins valores

 const data = [ { profileid: '1', points: 25, winner: true }, { profileid: '2', points: 15, winner: false }, { profileid: '3', points: 18, winner: false }, { profileid: '1', points: 15, winner: false }, { profileid: '2', points: 18, winner: false }, { profileid: '3', points: 25, winner: true }, ]; const result = {}; for (let i in data) { // Create current profileId object if (!result[data[i].profileid]) { result[data[i].profileid] = { wins: 0, points: 0, profileid: +data[i].profileid }; } // Bump points/wins values result[data[i].profileid].points += data[i].points; result[data[i].profileid].wins += +data[i].winner; } console.log(result);

about 4 years ago · Juan Pablo Isaza Denunciar

0

Puede sumar las wins de la misma manera que suma los points :

 const data = [ { profileid: '1', points: 25, winner: true }, { profileid: '2', points: 15, winner: false }, { profileid: '3', points: 18, winner: false }, { profileid: '1', points: 15, winner: true }, { profileid: '2', points: 18, winner: false }, { profileid: '3', points: 25, winner: true }, ] const result = data.reduce((acc, cur) => ({ ...acc, [cur.profileid]: { profileid: cur.profileid, points: cur.points + (acc[cur.profileid] ? acc[cur.profileid].points : 0), wins: cur.winner + (acc[cur.profileid] ? acc[cur.profileid].wins : 0) }, }), [] ) console.log(result)

También puede simplificar las wins de esta manera:
wins: !!(acc[cur.profileid]?.wins) + cur.winner

En caso de que acc[cur.profileid]?.wins devuelva undefined ,
puede convertirlo a un booleano por !! o Boolean() para evitar obtener NaN

booleano
Encadenamiento opcional (?.)

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda