-1

I have an array with few objects. I want to create a new array with sum of matching object.

var array = [
        {bill_no:123,paid:30 },
        {bill_no:123,paid:30 },
        {bill_no:345,paid:12 },
        {bill_no:345,paid:12 },
        {bill_no:444,paid:10 },
        {bill_no:555,paid:12 },
      ]

I want the ouput like

 {bill_no:123,paid:60},{bill_no:345,paid:24},{bill_no:555,paid:12}
thouseer
  • 25
  • 5
  • 1
    What have you tried so far to solve this? – Leonid Pyrlia Jul 19 '18 at 13:24
  • Can we please get little bit more information on the part "New array with sum of matching object". Does this mean you want to add bill1 and bill2 and return the paid price? – Luay Jul 19 '18 at 13:33
  • Possible duplicate of [How to merge duplicates in an array of objects and sum a specific property?](https://stackoverflow.com/questions/38294781/how-to-merge-duplicates-in-an-array-of-objects-and-sum-a-specific-property) – yuriy636 Jul 19 '18 at 13:41

2 Answers2

1

IMHO, you can use array#reduce and array#findIndex to do something like this:

var arr = [
        {bill_no:123,paid:30 },
        {bill_no:123,paid:30 },
        {bill_no:345,paid:12 },
        {bill_no:345,paid:12 },
        {bill_no:444,paid:10 },
        {bill_no:555,paid:12 },
      ]

var sum = arr.reduce((a, obj) => {
  let i = a.findIndex(o => o.bill_no == obj.bill_no);
  i == (-1) ? a.push(obj) : (a[i].paid += obj.paid);
  return a;
}, []);

console.log(sum);
BlackBeard
  • 10,246
  • 7
  • 52
  • 62
1

You can use Array.reduce() with find() operation inside the reduce():

var array = [
    {bill_no:123,paid:30 },
    {bill_no:123,paid:30 },
    {bill_no:345,paid:12 },
    {bill_no:345,paid:12 },
    {bill_no:444,paid:10 },
    {bill_no:555,paid:12 },
];
var res = array.reduce((acc, obj)=>{
  var existObj = acc.find(item => item.bill_no === obj.bill_no);
  if(existObj){
    existObj.paid += obj.paid;
    return acc;
  }
  acc.push(obj);
  return acc;
}, []);
console.log(res);
Ankit Agarwal
  • 30,378
  • 5
  • 37
  • 62