Tengo un objeto de matriz con ingresos, para cualquier ingreso duplicado quiero tener un solo registro que tenga una suma de todos los duplicados.
This the array object const incomes = [ { incomeType: 'DIVIDEND', incomeSubType: 'RECEIPT', payerName: 'Employer', expiryDate: '2022-03-10', regularAmountCalculated: { value: 2500, currencyCode: 'AUD' }, irregularAmountCalculated: null, bonusCalculated: { value: 200, currencyCode: 'AUD' } }, { incomeType: 'DIVIDEND', incomeSubType: 'RECEIPT', payerName: 'Employer', expiryDate: '2022-03-10', regularAmountCalculated: { value: 2500, currencyCode: 'AUD' }, irregularAmountCalculated: null, bonusCalculated: { value: 200, currencyCode: 'AUD' } } ];Espero que la salida tenga un registro único para Dividendo y una cantidad calculada como 5000.
Expected output const incomes = [ { incomeType: 'DIVIDEND', incomeSubType: 'RECEIPT', payerName: 'Employer 1', expiryDate: '2022-03-10', regularAmountCalculated: { value: 5000, currencyCode: 'AUD' }, irregularAmountCalculated: null, bonusCalculated: { value: 200, currencyCode: 'AUD' } }, ];He escrito:
const totals:any = []; statementOfIncomes.forEach(x => { const obj = totals.find(o => o.incomeType === 'DIVIDEND'); if (obj) { obj.regularAmountCalculated.value = obj.regularAmountCalculated.value + x.regularAmountCalculated?.value; } else { totals.push(x); } });el error que me sale es
ERROR TypeError: no se puede asignar a la propiedad de solo lectura 'valor' del objeto '[objeto Objeto]'
Sugeriría usar un Map para almacenar todos los ingresos únicos. Debe recorrer sus ingresos, verificar si el mapa ya tiene una entrada basada en el tipo de incomeType . De lo contrario, agréguelo al mapa; de lo contrario, obtenga el valor existente y agréguele el regularAmount . Por último, debe volver a convertir su mapa en un Array . Esto tiene un tiempo de ejecución de O(2n) en lugar de O(n^2) como se indicó en su primer enfoque.
const map = new Map(); incomes.forEach((income) => { if (!map.has(income.incomeType)) { map.set(income.incomeType, income); } else { const existingIncome = map.get(income.incomeType); existingIncome.regularAmountCalculated.value += income.regularAmountCalculated.value; map.set(income.incomeType, existingIncome); } }); const uniqueIncomes = Array.from(map, ([_key, value]) => value); // [ // { // incomeType: 'DIVIDEND', // incomeSubType: 'RECEIPT', // payerName: 'Employer', // expiryDate: '2022-03-10', // regularAmountCalculated: { value: 5000, currencyCode: 'AUD' }, // irregularAmountCalculated: null, // bonusCalculated: { value: 200, currencyCode: 'AUD' }, // }, // ];