Tengo una matriz JS que también contiene matrices y cada una contiene un montón de objetos estructurados como se muestra a continuación.
const arr1 = [ [{symbol: "xy", balance: 2155113}, {symbol: "asda", balance: 21231231}], [{symbol: "asda", balance: 6543}, {symbol: "xy", balance: 21678}] ]Lo que necesito es una matriz de salida, que agrupe todas las matrices secundarias por la propiedad "símbolo" y agregue (+) los saldos.
Al final quiero tener una matriz como esta
[ {symbol: xy, summedBalance: 213131313}, {symbol: yz, summedBalance: 6788767867}, ]¿Es esto posible con javascript normal o tal vez con un módulo como lodash?
Prueba algo como esto:
const arr1 = [ [{symbol: "xy", balance: 2155113}, {symbol: "asda", balance: 21231231}], [{symbol: "asda", balance: 6543}, {symbol: "xy", balance: 21678}] ] // Some variables const knownSymbolsArr = []; const finalArr = []; // First degroup your array const degroupedArr = arr1.flat(); // Iterate and sum balances degroupedArr.forEach(el => { // Unknown symbol, process if (knownSymbolsArr.indexOf(el.symbol) === -1) { // Sum balances when symbol is el.symbol const balance = degroupedArr.reduce((acc, val) => val.symbol === el.symbol ? acc + val.balance : acc, 0); // Add symbol in our knownSymbolsArr knownSymbolsArr.push(el.symbol); // Add data in our final array finalArr.push({ symbol: el.symbol, balance: balance }); } }); console.log(finalArr);La solución se puede dividir en dos partes:
symbol y calcule la suma. const ar = [ [{symbol: "xy", balance: 2155113}, {symbol: "asda", balance: 21231231}], [{symbol: "asda", balance: 6543}, {symbol: "xy", balance: 21678}] ] const flattenedAr = ar.reduce((acc, curElement) => { acc = [...acc, ...curElement]; return acc; }, []); const groupedAr = flattenedAr.reduce((group, curElement) => { const matchingElement = group.find(ele => ele.symbol === curElement.symbol); if(matchingElement) { matchingElement.summedBalance += curElement.balance; } else { group.push({ symbol: curElement.symbol, summedBalance: curElement.balance }); } return group }, []) console.log(groupedAr)