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

124
Views
Agrupando una matriz de javascript en un bucle

Tengo la siguiente matriz:

 [ {'id': 1, 'rating': 5, 'rating_category': "a"}, {'id': 1, 'rating': 1, 'rating_category': "a"}, {'id': 1, 'rating': 4, 'rating_category': "b"}, {'id': 1, 'rating': 5, 'rating_category': "b"}, ]

Y espera la siguiente matriz:

 [ { category: "a", rating_average: 3, rating_count: 2}, { category: "b", rating_average: 4.5, rating_count: 2}, ]

Mi enfoque funciona solo parcialmente. Simplemente no obtengo el formato de matriz que quiero. Obtengo una [key : {}, key : {}] pero quiero obtener [{},{}] . Mi problema es verificar si la clave ya existe en la matriz.

 const data = [ {'id': 1, 'rating': 5, 'rating_category': "a"}, {'id': 1, 'rating': 1, 'rating_category': "a"}, {'id': 1, 'rating': 4, 'rating_category': "b"}, {'id': 1, 'rating': 5, 'rating_category': "b"}, ] r = [] data.forEach(e => { if (! r[e.rating_category]) { r[e.rating_category] = { rating: e.rating, count: 1 }; } else { r[e.rating_category]['rating'] += e.rating r[e.rating_category]['count']++ } }) console.log(ra, rb)

about 4 years ago · Juan Pablo Isaza
3 answers
Answer question

0

Agregue la categoría como una propiedad en el objeto. Luego, al final, puede usar Object.values() para obtener todas las propiedades como una matriz.

r debe ser un objeto, no una matriz.

 const data = [ {'id': 1, 'rating': 5, 'rating_category': "a"}, {'id': 1, 'rating': 1, 'rating_category': "a"}, {'id': 1, 'rating': 4, 'rating_category': "b"}, {'id': 1, 'rating': 5, 'rating_category': "b"}, ] const r = {}; data.forEach(e => { if (! r[e.rating_category]) { r[e.rating_category] = { category: e.rating_category, rating: e.rating, count: 1 }; } else { r[e.rating_category]['rating'] += e.rating r[e.rating_category]['count']++ } }) console.log(Object.values(r))

about 4 years ago · Juan Pablo Isaza Report

0

Aquí hay una manera en que puede hacerlo de manera bastante eficiente. Básicamente, la idea es agrupar primero las calificaciones por categoría, luego calcular la duración y el promedio de las calificaciones para cada categoría y luego formatear su valor de retorno, así:

 let data = [ {'id': 1, 'rating': 5, 'rating_category': "a"}, {'id': 1, 'rating': 1, 'rating_category': "a"}, {'id': 1, 'rating': 4, 'rating_category': "b"}, {'id': 1, 'rating': 5, 'rating_category': "b"}, ] // group the ratings by category let grouped = data.reduce((res, curr) => { if (!res[curr.rating_category]) { res[curr.rating_category] = []; } res[curr.rating_category].push(curr.rating); return res; }, {}); // calculate length & average of each category and format return value let formatted = Object.entries(grouped).map(([key, value]) => { let average = value.reduce((res, curr) => res + curr, 0) / value.length; return { category: key, rating_count: value.length, rating_average: average } }); console.log(formatted)

about 4 years ago · Juan Pablo Isaza Report

0

Podría tomar una función para agrupar, como (con suerte) el próximo prototipo nuevo Array#groupBy y tomar el promedio usando una función de suma y devolver un nuevo objeto para cada grupo.

 Array.prototype.groupBy ??= function (callbackfn, thisArg) { const O = Object(this); const len = O.length >>> 0; if (typeof callbackfn !== 'function') throw new TypeError(callbackfn + ' is not a function'); let k = 0; const groups = {}; while (k < len) { const Pk = Number(k).toString(); const kValue = O[Pk]; const propertyKey = callbackfn.call(thisArg, kValue, Number(k), O); (groups[propertyKey] ??= []).push(kValue); ++k; } return groups; }; const sum = (array, key) => array.reduce((s, v) => s + (key ? v[key] : v), 0), data = [{ id: 1, rating: 5, rating_category: "a" }, { id: 1, rating: 1, rating_category: "a" }, { id: 1, rating: 4, rating_category: "b" }, { id: 1, rating: 5, rating_category: "b" }], result = Object .entries(data.groupBy(({ rating_category }) => rating_category)) .map(([category, a]) => ({ category, rating_average: sum(a, 'rating') / a.length, rating_count: a.length })); console.log(result);
 .as-console-wrapper { max-height: 100% !important; top: 0; }

about 4 years ago · Juan Pablo Isaza 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!