cancel
Showing results for 
Search instead for 
Did you mean: 

Reduce an array of objects into a single object with the sum of fields as the result

vgautam64
New Contributor III

I have an array of the following form:

vgautam64_1-1698229926838.png

I want to convert this array of objects into a single object that has the same fields along with Debit_Amount and Credit_Amount fields summed up.

vgautam64_2-1698230019762.png

Any help is appreciated!

1 ACCEPTED SOLUTION

koryknick
Employee

@vgautam64 - I believe this solves your question in the simplest way I can think of.  Use a Mapper snap with the following configuration:

koryknick_0-1701289383325.png

It appears to me that you only need the field elements and values from the first group element: $group[0]

The two jsonPath statements are simply pulling all values for the Debit and Credit Amounts into an array of numbers

Finally, the Array.reduce() method is used to aggregate that list of numbers into a final total.

Hope this helps!

 

View solution in original post

7 REPLIES 7

vgautam64
New Contributor III

Anyone?

vgautam64
New Contributor III

Supratim
Contributor III

@vgautam64  As I can't copy your json, have created my own, you can use it- 

Data  ==> 

{
    "carList": [
    {
    "color""purple",
    "type""minivan",
    "debit_amount"50,
    "credit_amount"7
  },
  {
    "color""red",
    "type""station wagon",
    "debit_amount"100,
    "credit_amount"5
  }, {
    "color""black",
    "type""toyota",
    "debit_amount"200,
    "credit_amount"5
  },
  {
    "color""blue",
    "type""Maruti",
    "debit_amount"300,
    "credit_amount"5
  }
]
}
 
1. mapper  : 
$carList.map((val,index)=>{"sum_debit_amount": jsonPath($, "carList[*].debit_amount").reduce((cur,acc)=>cur+acc),"sum_credit_amount" : jsonPath($, "carList[*].credit_amount").reduce((cur,acc)=>cur+acc)}.extend(val)).shift()

vgautam64
New Contributor III

Hi @Supratim,

Thanks for the providing a solution. I tried to validate the expression with the data I have and it seems to work when I validate the pipe. Strangely though, I observe that when I execute (not validate) the pipeline, the mapper that holds the expression only seem to process 50 records and gets stuck processing the 51st doc. But when I validate the pipe I am able to see the preview of 148 documents.

Any idea why this would happen?