Tengo esta matriz bidimensional
var data = [ ['12-9', 134], ['12-9', 148], ['12-9', 92], ['1-8', 116], ['1-8', 136], ['1-8', 150], ['21-5', 138], ['21-5', 143], ['21-5', 119], ['21-5', 125] ]y yo si el primer valor de un elemento coincide con el de los otros quiero calcular el promedio del segundo.
por ejemplo: los primeros 3 elementos tienen todos "12-9" y para eso debería darme 124,7 porque (137+148+92) / 3 = 124,7.
Esto podría ser muy fácil, pero estoy atascado. Lo probé con map() y reduce() o filter() pero nada me funciona. Estoy muy seguro de que no veo las cosas obvias aquí.
Y ahora descargué todo de nuevo y este es mi nuevo punto de partida ahora:
for (let item of data) { var temp = item[0]; var myValues = data.filter((value) => { return value[0] === temp; }); console.log(myValues ); }Filtrar y reducir es lo que necesitas
const data = [['12-9', 134],['12-9', 148],['12-9', 92],['1-8', 116],['1-8', 136],['1-8', 150],['21-5', 138],['21-5', 143],['21-5', 119],['21-5', 125]]; const avg = data.reduce((acc, item) => { const key = item[0] if (!acc[key]) { const same = data .filter(nums => nums[0] === key); acc[key] = { count: same.length, avg: +(same.reduce((acc, [key, num]) => acc + num, 0) / same.length).toFixed(2) // key is ignored we could use an underscore to show that } } return acc }, {}) console.log(avg)Aquí hay un ejemplo que se reduce a un mapa agrupado por el primer elemento y luego itera sobre el resultado para promediar las matrices agrupadas y reconstruir la forma de la matriz original.
const data = [['12-9', 134], ['12-9', 148], ['12-9', 92], ['1-8', 116], ['1-8', 136], ['1-8', 150], ['21-5', 138], ['21-5', 143], ['21-5', 119], ['21-5', 125],]; const map = data.reduce((a, [k, v]) => a.set(k, [...(a.get(k) ?? []), v]), new Map()); const result = [...map.entries()].map(([k, vs]) => [k, vs.reduce((a, b) => a + b) / vs.length]); console.log(result); O una lógica similar aplicada en bucles for...of sucesivos, pero esta vez rastreando una suma y un recuento continuos de cada elemento, evitando así la reducción posterior para calcular el promedio.
const data = [['12-9', 134], ['12-9', 148], ['12-9', 92], ['1-8', 116], ['1-8', 136], ['1-8', 150], ['21-5', 138], ['21-5', 143], ['21-5', 119], ['21-5', 125],]; const map = new Map(); for (const [key, value] of data) { if (!map.has(key)) { map.set(key, { sum: 0, count: 0 }); } map.get(key).count += 1; map.get(key).sum += value; } const result = []; for (const [key, { sum, count }] of map) { result.push([key, sum / count]); } console.log(result);