Creating an array of cumulative sum in javascript

arrays, javascript

Solution

An elegant solution copied from Nina Scholz, using currying to access the previous value.

const cumulativeSum = (sum => value => sum += value)(0);

console.log([5, 10, 3, 2].map(cumulativeSum));

`cumulativeSum` is the function `value => sum += value`, with `sum` initialized to zero. Every time it's called, `sum` is updated and will equal the previous value (output[n-1]) when called the next time (with input[n]).

Note that `sum` will need to be set to zero explicitly when you want to reuse the summation. The most convenient way to handle this may be to just inline the code instead of using a named function.

console.log([5, 10, 3, 2].map((sum => value => sum += value)(0)));
console.log([6, 10, 3, 2].map((sum => value => sum += value)(0)));

vs the unwanted behavior

const cumulativeSum = (sum => value => sum += value)(0);

console.log([5, 10, 3, 2].map(cumulativeSum));
console.log([6, 10, 3, 2].map(cumulativeSum));

Update 7.6.2022: You can use the comma operator instead of currying to make an easier-to-read version with explicit `sum = 0`.

console.log([5, 10, 3, 2].map((sum = 0, n => sum += n)));

Three years and no one thought to suggest this? :)

Problem

This is an example of what I need to do: ``` var myarray = [5, 10, 3, 2]; var result1 = myarray[0]; var result2 = myarray[1] + myarray[0]; var result3 = myarray[2] + myarray[1] + myarray[0]; var result4 = myarray[3] + myarray[2] + myarray[1] + myarray[0]; ``` so all that would output 5, 15, 18, 20 but instead of writing out all the vars like that, I want it to say something like: ``` var result = arrayitem + the sum of any previous items ``` Does that make sense? Is that possible? How do I do that?

Original source

Related problems