Cada vez que me gustaría usar reducir dentro de una función de mapa, aparece el error "reducir no es una función".
Tengo una matriz donde estoy mapeando a través de 2 claves. Fecha y Monto. A continuación se muestra la matriz con objetos.
const dividendArrayFiltered = [ { "date": "2021-11-09", "amount": 0.5 }, { "date": "2021-11-08", "amount": 0.5 }, { "date": "2021-11-08", "amount": 0.5 }, { "date": "2021-11-11", "amount": 1 }, { "date": "2021-11-11", "amount": 1 } ]Dentro de este mapa me gustaría reducir los valores con la misma fecha.
Este es el código que está dando el error. No estoy muy seguro de por qué la función de reducción no funciona. Espero que puedas ayudarme. ¡Gracias!
const summedDividend = dividendArrayFiltered.map(({ date, amount }) => { const grouped = date.reduce( (a, d, i) => a.set(d, (a.get(d) ?? 0) + amount[i]), new Map() ); return { date: [...grouped.keys()], amount: [...grouped.values()], }; });Su propia solución no funciona porque dentro de la función de mapa solo tiene acceso al elemento actual, no a la matriz, pero la función de reducción solo se puede usar en matrices.
Solución alternativa :
Puede crear una matriz vacía, donde inserta solo estos elementos de su matriz de origen, que no tienen la misma fecha que uno de los elementos de su nueva matriz.
let uniqueArray = [] // iterate through all array elements dividendArrayFiltered.forEach((item) => { // check if an element with the current item date exists in your new uniqueArray and which position index it has const itemPos = uniqueArray.findIndex(uniqueItem => uniqueItem.date == item.date) // if the index is negative, it's not included in the array, so you push your item to the new array if(itemPos < 0) { uniqueArray.push(item) } // if it's included, you take the old amount and add your new value else { uniqueArray[itemPos].amount = uniqueArray[itemPos].amount + item.amount; } }); console.log(uniqueArray); En uniqueArray ahora solo hay elementos de fecha únicos.
Puede reducir la matriz original directamente y también utilizar findIndex() :
const dividendArrayFiltered = [ { date: '2021-11-09', amount: 0.5 }, { date: '2021-11-08', amount: 0.5 }, { date: '2021-11-08', amount: 0.5 }, { date: '2021-11-11', amount: 1 }, { date: '2021-11-11', amount: 1 } ] const grouped = dividendArrayFiltered.reduce((a, c) => { const dateIndex = a.findIndex(o => o.date === c.date) if (dateIndex !== -1) a[dateIndex].amount += c.amount else a.push({ date: c.date, amount: c.amount }) return a }, []) console.log(grouped) .as-console-wrapper { min-height: 100% }