top of page

Map, Filter, reduce in Javascript

 .map(), .reduce(), and .filter().  are javascripts methods.

These methods are useful, as javascript employs functional programming paradigm.

Functional programming is 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.

Functional programming depends heavily on the use of lists and list operations. When  a list/array is presented to a Javascript program for instance, the program uses  map, filter and reduce functionalities to transform the input array/list to a new form, while keeping the same original list intact.

.map()

Given an array of multiple objects – each object representing an item. 

 let old_array=[20, 24, 56, 88]

assuming we want to multiply all the items in array

There are multiple ways to achieve this.

1. Using .forEach():

var new_array= [];

old_array.forEach(function (x) { new_array.push(x*x); });

console.log(new_array);

2. using .for():

for(var a of  old_array){

      new_array.push(a*a);

}

Notice how you have to create an empty array beforehand in the cases above? 

Now you see how the program can be simplified to one line.

3. using .map():

new_array= old_array.map(function (x) { return x*x });

console.log(new_array);

We can also make the code simpler by applying the arrow functions 

new_arrayold_array.map(x => x*x);

console.log(new_array);

Basically .map function takes 2 arguments, a callback and an optional value

The callback runs for each value in the array and returns each new value in the resulting array.  The resulting array is always  the same length as the original array.

.reduce()

Like the map() function, .reduce() also runs a callback for each element of an array. The different is that reduce() passes the result of this callback to (the accumulator----integer, string, object, etc-----which must be instantiated or passed when calling .reduce()) from one array element to the other.

using our initial array,  old_array=[20, 24, 56, 88] for example

We need to know the total of all the item in old_array. 

With .reduce(), it’s pretty straightforward:

new_array= old_array.reduce(function (sum, x) { return sum + x; }, 0);

console.log(new_array)

The value  0, is the starting value.

We can also make the code simpler by applying the arrow functions 

 

At the end the reduce function the code will return the final value of the accumulator (which is 188 for this example).

Let’s see how this can be shortened with ES6’s arrow functions:

new_array =  old_array.reduce((sum, x) =>sum + x, 0);

 

Take note, using .reduce() is an easy way to generate a single value or object from an array.

.filter()

The filter function removes unwanted elements from an array/list and return the removed  if assigned to a value or the remainder if not.

Using our initial array with additional words or letters,  old_array=['a', 20, 'man', 24, 56, 'welcome', 88]

Lets try and return a new array without numbers using .filter()

 

new_array =old_array.filter(function (val) { return typeof val != 'number'; });

Again, we can use the arrow function for this;

new_array = old_array.filter( val=> typeof val != 'number' );

 

Alternatively, we can create a seperate funtion for filtering and then pass a callback to the actual filter function

Example:

var old_array=['a', 20, 'man', 24, 56, 'welcome', 88]

function notNumber(val) {
    return typeof val != 'number'
}


function state_Function() {
    var new_arr=old_array.filter(notNumber);
    console.log(new_arr)
    document.getElementById("demo").innerHTML =new_arr;
}

state_Function() 

 

 

 

 

FURTHER EXAMPLE:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Exercise:

Return only the workers with salary greater than 1000 pounds from the array below:

var employee = [ { id: 10, name: "Paul Dameon", salary: 800, }, { id: 20, name: "Temmo Wex", salary: 2000, }, { id: 41, name: "Kalim Lintra", salary: 5000, }, { id: 99, name: "Akpova Asty", salary: 600, },  { id: 66, name: "Pahun Linto", salary: 5000, }, { id: 72, name: "Cynthia Ross", salary: 8000, }];

filter.JPG
filter2.JPG
filter3.JPG
bottom of page