Tengo una matriz como-
const a = [ { value: 1, week: 'week1', }, { value: 2, week: 'week1', }, { value: 3, week: 'week16', }, { value: 4, week: 'week0', }, { value: 5, week: 'week16', }, ]Quiero tener una matriz modificada de la siguiente manera:
let modified = [ { value: 1.5, week: 'week1', }, { value: 4, week: 'week16', }, { value: 4, week: 'week0', }, ]En esta matriz modificada, la semana duplicada se colocó solo una vez y el valor se reemplazó por el promedio del valor total en los objetos duplicados particulares.
Puede recopilar los valores en un objeto y luego calcular el promedio dividiendo su suma entre la cantidad de valores disponibles para una semana determinada:
const a = [{ value: 1, week: 'week1', }, { value: 2, week: 'week1', }, { value: 3, week: 'week16', }, { value: 4, week: 'week0', }, { value: 5, week: 'week16', }]; const result = Object.entries( a.reduce((a, {value, week}) => ({ ...a, [week]: [...a[week] || [], value] }), {}) ).map(([week, values]) => ({ week, value: values.reduce((a, v) => a + v, 0) / values.length })); console.log(result);puedes hacerlo de manera simple como a continuación,
1.Crear un mapa y agregar valores de semana similar y mantener su cuenta 2.Luego creado modificado a partir de eso.
const a = [ { value: 1, week: 'week1', }, { value: 2, week: 'week1', }, { value: 3, week: 'week16', }, { value: 4, week: 'week0', }, { value: 5, week: 'week16', }, ]; const helperMap = {} a.forEach((obj) => { if (!!helperMap[obj.week]) { helperMap[obj.week]['sum'] += obj.value; helperMap[obj.week]['count'] += 1; } else { helperMap[obj.week] = { sum: obj.value, count: 1 }; } }); const modified = []; for (let week in helperMap) { let avgValue = helperMap[week]['sum'] / helperMap[week]['count']; modified.push({ week, value: avgValue }); } console.log(modified)Podemos hacerlo en formas cortas usando funciones incorporadas también, pero será mejor entender el concepto
const a = [ { value: 1, week: 'week1', }, { value: 2, week: 'week1', }, { value: 3, week: 'week16', }, { value: 4, week: 'week0', }, { value: 5, week: 'week16', }, ] let modified = []; a.forEach(item => { let match = modified.find(m => m.week === item.week); if (match) match.value = (match.value + item.value); else modified.push(item); }); modified.forEach(m => m.value = m.value / a.filter(a => a.week === m.week).length); console.log(modified)