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

99
Vistas
Crear un método de reducción que pueda manejar cualquier cantidad de objetos con ID únicos

Estoy tratando de usar el método de reducción para clasificar una serie de objetos. Mi objetivo es crear un método de reducción que pueda manejar cualquier cantidad de objetos (con identificadores de eventos únicos). La salida deseada tendría este formato pero con la capacidad de manejar más de cinco ID de evento únicos

[Salida deseada]

 (5) [{…}, {…}, {…}, {…}, {…}] 0: eventId: "12345" total: Array(3) 0: {total: 123} 1: {total: 45} 2: {total: 123} length: 3 1: {total: Array(3), eventId: '12347'} 2: {total: Array(3), eventId: '12349'} 3: {total: Array(3), eventId: '12348'} 4: {total: Array(3), eventId: '12346'}

Para obtener el resultado anterior, utilicé este método de reducción.

[Método de reducción]

 const sortedSalesData = salesData.reduce((acc, obj) => { for ( let i = 0; i<salesData.length; i++) { if (obj.eventId === salesData[i].eventId ) { acc[i].eventId = salesData[i].eventId; acc[i].total = [...acc[i].total, {total: obj.total}]; return acc; } }; },[{total:[]},{total:[]},{total:[]},{total:[]},{total:[]}]);

Pero no estoy seguro de cómo configurarlo para manejar más de esos cinco identificadores de eventos únicos. A continuación se muestra la matriz original como referencia.

[Matriz original]

 const salesData = [ { eventId: '12345', total: 123 }, { eventId: '12347', total: 45 }, { eventId: '12349', total: 78 }, { eventId: '12348', total: 123 }, { eventId: '12346', total: 45 }, { eventId: '12349', total: 78 }, { eventId: '12347', total: 123 }, { eventId: '12345', total: 45 }, { eventId: '12348', total: 78 }, { eventId: '12345', total: 123 }, { eventId: '12347', total: 45 }, { eventId: '12346', total: 78 }, { eventId: '12349', total: 123 }, { eventId: '12348', total: 45 }, { eventId: '12346', total: 78 }, ];

El problema es llevarlo a un lugar donde puede manejar cualquier cantidad de eventos únicos sin tener que agregar un {total:[]} adicional al final del método.

about 4 years ago · Santiago Gelvez
2 Respuestas
Responde la pregunta

0

Desea iterar sobre la matriz inicial (obj), insertar el elemento iterado en una nueva matriz (acc) si eventId aún no existe en dicha matriz, cuando existe (accObj), desea empujar el objeto total del elemento actual (obj) en la matriz total del nuevo elemento (accObj)?

Creo que esto hace lo que necesitas:

 let array = [ { eventId: '12345', total: 123 }, { eventId: '12347', total: 45 }, { eventId: '12349', total: 78 }, { eventId: '12348', total: 123 }, { eventId: '12346', total: 45 }, { eventId: '12349', total: 78 }, { eventId: '12347', total: 123 }, { eventId: '12345', total: 45 }, { eventId: '12348', total: 78 }, { eventId: '12345', total: 123 }, { eventId: '12347', total: 45 }, { eventId: '12346', total: 78 }, { eventId: '12349', total: 123 }, { eventId: '12348', total: 45 }, { eventId: '12346', total: 78 }, ] let reducedArray = array.reduce((acc, obj) => { console.log("Element " + JSON.stringify(obj)); let accObj = acc.find(accObj => accObj.eventId === obj.eventId); if(accObj != undefined) { console.log("Found element: " + JSON.stringify(accObj) + ".") console.log("Pushing "+ obj.total +" to total.") accObj.total.push(obj.total); } else { accObj = { eventId: obj.eventId, total: [obj.total] }; console.log("Pushing new element to list: " + JSON.stringify(accObj)); acc.push(accObj); } return acc; }, []); console.log(JSON.stringify(reducedArray));

El truco está en el método de find , estoy buscando en mi propia lista reductora para ver si ya tiene un elemento que comparte eventId con la matriz anterior.

about 4 years ago · Santiago Gelvez Denunciar

0

No soy fanático de .reduce, así que aquí hay una solución fácil sin él.

 const salesData = [ { eventId: '12345', total: 123 }, { eventId: '12347', total: 45 }, { eventId: '12349', total: 78 }, { eventId: '12348', total: 123 }, { eventId: '12346', total: 45 }, { eventId: '12349', total: 78 }, { eventId: '12347', total: 123 }, { eventId: '12345', total: 45 }, { eventId: '12348', total: 78 }, { eventId: '12345', total: 123 }, { eventId: '12347', total: 45 }, { eventId: '12346', total: 78 }, { eventId: '12349', total: 123 }, { eventId: '12348', total: 45 }, { eventId: '12346', total: 78 }, ] let reduced = {} salesData.forEach(elem=> { if(reduced[elem.eventId] !== undefined){ reduced[elem.eventId].push(elem.total) } else { reduced[elem.eventId] = [elem.total] } }) reduced = Object.keys(reduced).map(elem => { return({eventId: elem, total:reduced[elem]}) }) console.log(reduced)

about 4 years ago · Santiago Gelvez 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