Tengo algunos datos:
const data = [ [ [1609459200000, 18], [1612137600000, 12], [1614556800000, 12], [1617231600000, 14] ], [ [1609459200000, 30], [1612137600000, 501], [1614556800000, 81], [1617231600000, 82], ] ]Los números largos son marcas de tiempo y quiero devolver una matriz como la siguiente:
const result = [{ x: 1609459200000, y: 48 }, { x: 1612137600000, y: 513 }, { x: 1614556800000, y: 93 }, { x: 1617231600000, y: 96 }]La X contendrá la marca de tiempo y la Y será la suma de los valores en el índice 1 de cada matriz interna, correspondiente a cada marca de tiempo.
En caso de que uno de los elementos de la matriz tenga más valores que el otro, debería sumarlo de todos modos como se muestra a continuación:
const data = [ [ [1609459200000, 18], [1612137600000, 12], [1614556800000, 12], [1617231600000, 14] ], [ [1609459200000, 30], [1612137600000, 501], [1614556800000, 81], ] ] const result = [{ x: 1609459200000, y: 48 }, { x: 1612137600000, y: 513 }, { x: 1614556800000, y: 93 }, { x: 1617231600000, y: 14 }]Mis intentos fueron completamente inútiles y no pude pasar la parte donde la matriz es multidimensional.
HA FALLADO
const totals = data.reduce((total, curr, i) => { total = { x: curr[0][i], y: curr[1][i] } }, {}) console.log('total', totals)EDITAR
La matriz de datos puede tener más de 2 sub-matrices.
Puede aplanar la matriz y luego realizar una operación de reduce sobre ella, utilizando un objeto para almacenar la suma de cada marca de tiempo.
const data = [ [ [1609459200000, 18], [1612137600000, 12], [1614556800000, 12], [1617231600000, 14] ], [ [1609459200000, 30], [1612137600000, 501], [1614556800000, 81], [1617231600000, 82], ] ]; const res = Object.values(data.flat().reduce((acc, [x,y])=>{ (acc[x] ??= {x, y: 0}).y += y; return acc; }, {})); console.log(res); const data = [ [ [1609459200000, 18], [1612137600000, 12], [1614556800000, 12], [1617231600000, 14] ], [ [1609459200000, 30], [1612137600000, 501], [1614556800000, 81] ] ] const arr = [...data.flat() .reduce((a, [x, y]) => { a.has(x) ? (a.get(x).y += y) : a.set(x, { y }) return a }, new Map())].map(([x, { y }]) => ({ x, y })) console.log( arr )Puedes lograr esto en 3 pasos:
x ).Los pasos 2 y 3 pueden intercambiarse.
Código de ejemplo:
const data = [[[16094592e5,18],[16121376e5,12],[16145568e5,12],[16172316e5,14]],[[16094592e5,30],[16121376e5,501],[16145568e5,81],[16172316e5,82]]]; const res = data.flatMap(e => e.flatMap(([x, y]) => ({x, y}))) .reduce((acc, e) => { const found = acc.find(x => xx === ex) found ? found.y += ey : acc.push(e) return acc }, []) console.log(res) .as-console-wrapper { max-height: 100% !important; top: 0; } /* ignore this */