cancel
Showing results for 
Search instead for 
Did you mean: 

Cumulative sum of a value in an array

spinaka
New Contributor III

Hi Everyone,

I need help on an expression solution. The “sum” should be the sum of the value(s) of “key2” from previous records till the current record within the array.

I’m trying to make it using the “reduce” function.

Input:

[
  {
    "key1": "value1",
    "key2": 10
  },
  {
    "key1": "value2",
    "key2": 20
  },
  {
    "key1": "value3",
    "key2": 30
  }
]

Expected Output:

[
  {
    "key1": "value1",
    "key2": 10,
    "sum": 10
  },
  {
    "key1": "value2",
    "key2": 20,
    "sum": 30
  },
  {
    "key1": "value3",
    "key2": 30,
    "sum": 60
  }
]
1 ACCEPTED SOLUTION

Here’s a corrected version of the expression:

$array.map((x,index)=> index==0 ? x.extend({sum:x.key2}) : x.extend({sum:$array.slice(0,index+1).reduce((acc,curr)=> acc+curr.key2,0)}))

Let me know if this works for you, and I will explain in details on how the expression works.

image

View solution in original post

6 REPLIES 6

bojanvelevski
Valued Contributor

Hey @spinaka,

If the records are in an array, than use the following expression:

$array.reduce((acc,curr)=> acc+curr.key2, 0)

Or if you are able, you can split the array and use the Aggregate snap with SUM function selected.

Regards,
Bojan

Blockquote

Hi @bojanvelevski, Thanks for the response.
This Aggregation just gives the sum of all the values that is 60., but we need the cumulative sum in every record as shown in the example output.

sum = sum in the previous record + key2 in the current record.

Here’s a corrected version of the expression:

$array.map((x,index)=> index==0 ? x.extend({sum:x.key2}) : x.extend({sum:$array.slice(0,index+1).reduce((acc,curr)=> acc+curr.key2,0)}))

Let me know if this works for you, and I will explain in details on how the expression works.

image

This is perfect @bojanvelevski
I was trying with index, map and your expression is better than mine. 🙂

Would you mind explaining the reduce function used here?