Setting initialValue of Array.prototype.reduce with a default argument

# Zacqary Adam Xeper (9 years ago)

Not sure if this has been proposed, discussed, and soundly rejected before, but I wasn't able to find any mention of it in the archives.

Let's say I'm using Array.prototype.reduce with an initialValue to convert an array into an object, like this:

[0,1,2,3,4].reduce((result, val) => {
    let key = val % 2 ? "even" : "odd";
    return {...result, [key]: val};
}, {})

The problem with that is it takes you all the way to the end of the function to find out what the initial value of result is (in this case, an object). This is bad for code readability.

Now that ES2015 has introduced default arguments, it would make a lot more sense if I could say:

array.reduce( (result = {}, val) => {} )

I know this presents a backwards-compatibility issue. Is that surmountable?

# Alan Johnson (9 years ago)

That would prevent you from using an initial value that isn’t undefined while also coping with a reducer that might choose to return undefined — it would always be converted to the initial value, when you might actually want the undefined to propagate.

But even without that little wrinkle, given all of the warts in Javascript and its standard library that have been kept around all these years in the name of backward-compatibility, it seems super unlikely a breaking change would be adopted.

# Nelo Mitranim (9 years ago)

Changing Array.prototype isn’t worth the effort. Write your own reduce function that does exactly what you want:

function foldr (list, func, acc) {
  for (let i = list.length; --i >= 0;) acc = func(acc, list[i], i)
  return acc
}

This will default the initial value to undefined and let you omit it.