Due to that reason we were introduced with these three higher order functions, namely 🗺️Map, 🥅Filter & ✂️Reduce.
But before going into the functions, let’s clear out what are higher order functions and Functional Programming.
Photo by Roman Mager on Unsplash
Functional programming is a programming paradigm — a style of building the structure and elements of computer programs — that treats computation as the evaluation of mathematical functions and avoids changing-state and mutable data — Wikipedia
Photo by Yeshi Kangrang on Unsplash
Higher order functions are functions that that takes other functions as arguments or return them. In simple words, if a function is returning another function or taking a function as an argument to operate upon, than that function is called a Higher Order Function.
All of the map
, filter
and reduce
operate upon arrays but behave very differently.
Let’s dive in!
The
**map()**
method creates a new array with the results of calling a provided function on every element in the calling array → MDN
Photo by Capturing the human heart. on Unsplash
var arr = [5, 7, 4, 12];let map = arr.map(x => x * 7);console.log(map);
The above codes takes in each element of the array ,multiplies it with 7 and puts it in a new array(done by map
internally)
the same with a for loop
var arr = [5, 7, 4, 12];var map=[];var i=0;for(i=0;i<arr.length;i++){map.push(arr[i]*7)}console.log(map);
From 3 lines we directly went to 7 lines of code, which is more than double.
map
calls a provided callback
function upon each element in the array and constructs a new array from the results. callback
is called only for indexes for which the array contains a value.
map
builds a new array and never changes/mutates the old one, it just iterates over the old array, but the mutation can be done if the callback is programmed to do so.
When the map
function starts iterating over the array a range which is the length of the array is set and if new elements are added to the array during this time, map
won’t access them.
Let’s dissect it-
Parameters- The parameters taken by the map
function is a callback function which in turn takes parameters currentValue, index & array.
map
was called upon.Return-
map
returns a new array with the values processed by the callback.
The
**filter()**
method creates a new array with all elements that pass the test implemented by the provided function→MDN
Photo by Wade Austin Ellis on Unsplash
var cars = ['Mclaren','Lamborghini','Ferrari','Porsche','Mercedes','Corvette'];let car = cars.filter(e => e.length > 7);console.log(car);
The above codes takes in each element of the array, checks if the element length is greater then 7 and puts it in a new array(done by filter
internally)
the same with for loop.
var cars = ['Mclaren','Lamborghini','Ferrari','Porsche','Mercedes','Corvette'];let car=[]for(let i=0;i<cars.length;i++){if(cars[i].length>7)car.push(cars[i]);}console.log(car);
From 3 lines to 8 lines
filter
calls a provided callback
function upon each element in the array and constructs a new array from the results. callback
only returns the value which satisfy the condition or in other words is evaluated to true. callback
is called only for indexes for which the array contains a value.
filter
builds a new array and never changes/mutates the old one, it just iterates over the old array.
When the filter
function starts iterating over the array a range which is the length of the array is set and if new elements are added to the array during this time, filter
won’t access them.
Let’s dissect it-
Parameters- The parameters taken by the filter
function is a callback function which in turn takes parameters currentValue, index & array.
filter
.filter
was called upon.Return-
filter
returns a new array with the true
values processed by the callback.
The
**reduce()**
method executes a reducer function (that you provide) on each member of the array resulting in a single output value→MDN
Photo by Plush Design Studio on Unsplash
const arr = [3, 4, 2, 9];const reduce=(accumulator, currentValue)=>accumulator+currentValue;console.log(arr.reduce(reduce));console.log(arr.reduce(reduce, 7));
In the above code, we create a reduce function which will be passed as a callback to the .reduce()
function. The function returns the addition of all the elements in the array. The accumulator
stores the sum of the elements after every iteration and currentValue
represents the value currently processed. The default value of the accumulator is 0 and can also be user defined as done in the second console.log
as 7. The accumulator is returned as a final result.
with for loop
const arr = [3, 4, 2, 9];var a=0;for(leti=0;i<arr.length;i++){a+=arr[i];}console.log(a);
From 3 lines we go to 7 lines.
reduce
calls a provided callback
function upon each element in the array and is called only for indexes for which the array contains a value.
The callback
is given 4 arguments
accumulator
currentValue
currentIndex
array
The first time when the callback
is called just before processing the first value the currentValue
will be the first element in the array while the accumulator
will have the value of the first element of the array or the value which is specified by the user in the reduce
function.
If the accumulator is provided a value then reduce
will start the callback
from index 1 and skip the first index as accumulator
already has the value of the first index. If initially the value is provided the callback
will start from the first index.
The first time the callback is called, accumulator
and currentValue
can be one of two values. If initialValue
is provided in the call to reduce()
, then accumulator
will be equal to initialValue
, and currentValue
will be equal to the first value in the array. If no initialValue
is provided, then accumulator
will be equal to the first value in the array, and currentValue
will be equal to the second.
If the array is empty and no initial value is given to the accumulator
, a TypeError
is thrown.
It is usually safer to provide an initial value because there are three possible outputs without initialValue
, as shown in the following example.
Let’s dissect it-
Parameters- The parameters taken by the reduce
function is a callback function which in turn takes parameters accumulator, index, array & currentValue.
reduce
.reduce
was called upon.callback
.Return-
reduce
returns the value left after reduce is done(accumulator
).
As we have seen reduce, filter and map are quite powerful on their own, but the cherry on top of the cake is that they all work on arrays and thus can be chained together.
Photo by Katherine Chase on Unsplash
Let’s take an example-
var cars = [{name: "Lamborghini",maxSpeed:320,beauty:99},{name: "Lamborghini",maxSpeed:340,beauty:99},{name: "Ferrari",maxSpeed:310,beauty:99},{name: "Porsche",maxSpeed:330,beauty:99},{name: "Lamborghini",maxSpeed:300,beauty:99}];
The above is the data we will be working with. We have to find the total score of all the Lamborghini’s.
Its a one liner-
Result-
With a for loop we had to create 3 loops which will be quite a mess.
The code works like-
Hope I made the functions quite understandable. Chaining all the 3 functions together makes this a monster as we get our results with writing clean code which is small in length and easy to debug.
Clap & Follow.