Reputation: 197
This is my array which I'm pulling from Firebase with a listener.
[{"Amount": "40", "Day": "08/31/2022"}, {"Amount": "300", "Day": "09/01/2022"}, {"Amount": "1715", "Day": "08/31/2022"}, {"Amount": "250", "Day": "08/31/2022"}, {"Amount": "100", "Day": "08/31/2022"}, {"Amount": "200", "Day": "08/31/2022"}]
I want this array to sum up all values on the same day, and return just one with the summed amount. So I can use it for a chart in React Native with victory native.
This is my code, which is working fine, but I've been looking and looking all over the internet on how, to sum up, but no luck so far!
const q = query(collection(db, "users"), where("moneda", "==", "$"));
const unsubscribe = onSnapshot(q,(querySnapshot) => {
const dolarCurrency = [];
const months =[];
querySnapshot.forEach((doc) =>{
dolarCurrency.push(doc.data().cantidad);
months.push(doc.data().fecha)
})
const hash = months.map((Day) => ({ Day }));
const hashDolar = dolarCurrency.map(( Amount ) => ({ Amount }))
const output = hash.map(({Day},i) => ({Day, ...hashDolar[i]}));
console.log(output)
})
Any help or advice will be much appreciated my friends!
Upvotes: 0
Views: 1985
Reputation: 820
Reduce array function can solve your problem.
const output = [{"Amount": "40", "Day": "08/31/2022"}, {"Amount": "300", "Day": "09/01/2022"}, {"Amount": "1715", "Day": "08/31/2022"}, {"Amount": "250", "Day": "08/31/2022"}, {"Amount": "100", "Day": "08/31/2022"}, {"Amount": "200", "Day": "08/31/2022"}]
const sum = output.reduce((acc, cur)=> {
const found = acc.find(val => val.Day === cur.Day)
if(found){
found.Amount+=Number(cur.Amount)
}
else{
acc.push({...cur, Amount: Number(cur.Amount)})
}
return acc
}, [])
console.log(sum)
Upvotes: 1
Reputation: 63560
Object.values
to get those objects into a new array.const arr = [{"Amount": "40", "Day": "08/31/2022"}, {"Amount": "300", "Day": "09/01/2022"}, {"Amount": "1715", "Day": "08/31/2022"}, {"Amount": "250", "Day": "08/31/2022"}, {"Amount": "100", "Day": "08/31/2022"}, {"Amount": "200", "Day": "08/31/2022"}];
const out = {};
for (const { Amount, Day } of arr) {
out[Day] ??= { Day, Amount: 0 };
const subtotal = out[Day].Amount + Number(Amount);
out[Day] = { ...out[Day], Amount: subtotal };
}
console.log(Object.values(out));
Upvotes: 0