Home > Software design >  How to sum up array with same values in JavaScript?
How to sum up array with same values in JavaScript?

Time:09-03

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!

CodePudding user response:

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)

CodePudding user response:

  1. Create a new object that can store key/value pairs where the key is the date.
  2. Iterate over the objects adding the date as the key if it doesn't exist, and initialising it to an object with a date, and an amount set to zero.
  3. Add the current amount value to the amount store in the object for that date.
  4. Finally, after the loop is complete, use 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));

  • Related