Extraje datos de un archivo CSV de una transacción criptográfica y agrupé los resultados usando la columna Token. Así es como se ve la matriz agrupada
**[ ETH:[ [ 1571967200, 'DEPOSIT', 'ETH', 0.68364 ], [ 1571967189, 'WITHDRAWAL', 'ETH', 0.493839 ], [ 1571967110, 'DEPOSIT', 'ETH', 0.347595 ], [ 1571966982, 'WITHDRAWAL', 'ETH', 0.266166 ], [ 1571966641, 'DEPOSIT', 'ETH', 0.899781 ], [ 1571966421, 'DEPOSIT', 'ETH', 0.218207 ], [ 1571966410, 'DEPOSIT', 'ETH', 0.205472 ], [ 1571966250, 'WITHDRAWAL', 'ETH', 0.761543 ], [ 1571966124, 'DEPOSIT', 'ETH', 0.66315 ], [ 1571965892, 'DEPOSIT', 'ETH', 0.554933 ] ], BTC: [ [ 1571966685, 'DEPOSIT', 'BTC', 0.658794 ], [ 1571966568, 'DEPOSIT', 'BTC', 0.630386 ], [ 1571966566, 'DEPOSIT', 'BTC', 0.985879 ], [ 1571966499, 'DEPOSIT', 'BTC', 0.162165 ], [ 1571966329, 'WITHDRAWAL', 'BTC', 0.063663 ], [ 1571966194, 'DEPOSIT', 'BTC', 0.858688 ], [ 1571966049, 'DEPOSIT', 'BTC', 0.696682 ], [ 1571966026, 'DEPOSIT', 'BTC', 0.747093 ], [ 1571965990, 'WITHDRAWAL', 'BTC', 0.987358 ] ] ]**Aquí está el código que he usado para agrupar
inputStream.pipe(new CsvReadableStream({ parseNumbers: true, parseBooleans: true, trim: true })) .on('data', (row)=> { csvData.push(row); }) .on('end', function () { groupedResult = csvData.reduce((acc, curr) => { if(!acc[curr[2]]){ acc[curr[2]] = []; } acc[curr[2]].push(curr); return acc; },[]); });Estoy tratando de sumar todos los depósitos y restar los retiros de cada grupo. A continuación se muestra el código que estoy usando para agrupar los retiros y también los depósitos, pero desafortunadamente no funciona. ¿Qué podría estar haciendo mal o cómo sumo todos los depósitos y resto los retiros de cada token?
for(groupName in groupedResult){ groupedResult[groupName].reduce((acc, curr)=>{ acc[curr[1]] = curr[1]; },[]) }Aquí está el error que estoy recibiendo
acc[curr[1]] = curr[1]; ^ TypeError: Cannot set property 'WITHDRAWAL' of undefined at E:\Command Line\bin\index.js:46:34 at Array.reduce (<anonymous>)Este es el resultado deseado que estoy tratando de obtener
[ ETH:[ [ Balance['Value here'] ], ], BTC: [ [ Balance['value here'] ], ] ]La devolución de llamada "reductor" de Array#reduce(reducer, initValue, ...) tiene que devolver el valor del acumulador ( return acc; ) para usar en la siguiente ronda.
Esto se debe a que es posible que deba manejar valores primitivos que no mantienen referencias consistentes, por ejemplo, en una situación en la que desea sumar una lista de números: [1, 2, 3, 4].reduce((number,acc) => {return number+acc;}, 0)
const groupedResult = { ETH:[ [ 1571967200, 'DEPOSIT', 'ETH', 0.68364 ], [ 1571967189, 'WITHDRAWAL', 'ETH', 0.493839 ], [ 1571967110, 'DEPOSIT', 'ETH', 0.347595 ], [ 1571966982, 'WITHDRAWAL', 'ETH', 0.266166 ], [ 1571966641, 'DEPOSIT', 'ETH', 0.899781 ], [ 1571966421, 'DEPOSIT', 'ETH', 0.218207 ], [ 1571966410, 'DEPOSIT', 'ETH', 0.205472 ], [ 1571966250, 'WITHDRAWAL', 'ETH', 0.761543 ], [ 1571966124, 'DEPOSIT', 'ETH', 0.66315 ], [ 1571965892, 'DEPOSIT', 'ETH', 0.554933 ] ], BTC: [ [ 1571966685, 'DEPOSIT', 'BTC', 0.658794 ], [ 1571966568, 'DEPOSIT', 'BTC', 0.630386 ], [ 1571966566, 'DEPOSIT', 'BTC', 0.985879 ], [ 1571966499, 'DEPOSIT', 'BTC', 0.162165 ], [ 1571966329, 'WITHDRAWAL', 'BTC', 0.063663 ], [ 1571966194, 'DEPOSIT', 'BTC', 0.858688 ], [ 1571966049, 'DEPOSIT', 'BTC', 0.696682 ], [ 1571966026, 'DEPOSIT', 'BTC', 0.747093 ], [ 1571965990, 'WITHDRAWAL', 'BTC', 0.987358 ] ] }; const groupedBalance = {}; for(groupName in groupedResult) { const accumulated = groupedResult[groupName].reduce((acc, curr)=>{ acc[curr[1]] += curr[3]; return acc; // ← return the accumulator to use for the next round }, {DEPOSIT: 0, WITHDRAWAL: 0}); console.log(groupName, accumulated); groupedBalance[groupName] = { Balance: accumulated['DEPOSIT'] - accumulated['WITHDRAWAL'] }; } console.log('FINAL RESULTS:', groupedBalance);