Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

98
Views
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 answers
Answer question

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!