F3C Part 3 - Reduce basics

FunFunFunction Video: Reduce basics - Part 4 of Functional Programming in JavaScript

(This post is part of the F3C series)

Higher-order functions map, filter and reject perform list transformations, where each time, the end result is still a list. find is a related function which is designed to return just a single element.

reduce is a related higher order function, but the shape of the end result is whatever you want it to be. It's like the swiss army chainsaw of list transformations. Unlike the functions above, reduce takes two parameters. As well as the callback function, it takes a starting value, which - after the accumulation that takes place when processing each of the list's elements - becomes the end result.

The starting value can be any "shape" - a scalar, an array, or an object.

This means that if map, filter, reject or similar functions don't do what you need, you can write your own using reduce. A common fun exercise is implementing those functions with reduce, too.

Let's reimplement reject, this time using reduce:

Array.prototype.reject = function(pred) {  
  return this.reduce((l, x) => {
    if (! pred(x)) l.push(x);
    return l;
  }, []);
}

The function implementation transforms the given array (in this) with reduce. Here the starting value is [], an empty array, and we use similar logic with the passed-in predicate function to determine whether each element should be accumulated into the starting value or not.