What are collections?
Collections are a data type that we often use to store data in the form of a list of values, called specific arrays, sets and maps.
Why should I care about it?
In JavaScript, we often have to work with collections, such as pointing to each element in turn, filtering out the needed items, finding an element or even reducing the original array in various ways.
There are 3 main methods for manipulating collections: .map()
, .filter()
, and .reduce()
.
Mastering these 3 methods is an important step to writing a code sạch
, clear and understandable code.
Let’s start with an array containing the following developer
information:
1 2 3 4 5 6 7 8 | <span class="token keyword">let</span> developers <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token punctuation">{</span> id <span class="token punctuation">:</span> <span class="token number">1</span> <span class="token punctuation">,</span> name <span class="token punctuation">:</span> <span class="token string">'Bjarne Stroustrup'</span> <span class="token punctuation">,</span> born <span class="token punctuation">:</span> <span class="token number">1950</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">{</span> id <span class="token punctuation">:</span> <span class="token number">2</span> <span class="token punctuation">,</span> name <span class="token punctuation">:</span> <span class="token string">'James Gosling'</span> <span class="token punctuation">,</span> born <span class="token punctuation">:</span> <span class="token number">1955</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">{</span> id <span class="token punctuation">:</span> <span class="token number">3</span> <span class="token punctuation">,</span> name <span class="token punctuation">:</span> <span class="token string">'Linus Torvalds'</span> <span class="token punctuation">,</span> born <span class="token punctuation">:</span> <span class="token number">1969</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">{</span> id <span class="token punctuation">:</span> <span class="token number">4</span> <span class="token punctuation">,</span> name <span class="token punctuation">:</span> <span class="token string">'Guido van Rossum'</span> <span class="token punctuation">,</span> born <span class="token punctuation">:</span> <span class="token number">1956</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">{</span> id <span class="token punctuation">:</span> <span class="token number">5</span> <span class="token punctuation">,</span> name <span class="token punctuation">:</span> <span class="token string">'Ken Thompson'</span> <span class="token punctuation">,</span> born <span class="token punctuation">:</span> <span class="token number">1943</span> <span class="token punctuation">}</span> <span class="token punctuation">]</span> |
Map pattern
The map will apply a function to each molecule in the array and return a new array with the value that results from running that function.
Enough with it is enough. Understand as simple as we now have an array of objects, if you want to modify the data of each element, or simply retrieve the necessary attributes, use .map()
.
For example, we just need to retrieve the birth date of each developer, how to do it.
Input: An array of developers data
Output: An array of data containing only the names of the developers
When not using map ():
Use for()
:
1 2 3 4 5 6 7 8 9 10 11 | <span class="token keyword">var</span> <span class="token function-variable function">listNameEmployeesUsingFor</span> <span class="token operator">=</span> <span class="token keyword">function</span> <span class="token punctuation">(</span> developers <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> listNames <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token punctuation">]</span> <span class="token punctuation">;</span> <span class="token keyword">for</span> <span class="token punctuation">(</span> <span class="token keyword">let</span> i <span class="token operator">=</span> <span class="token number">0</span> <span class="token punctuation">;</span> i <span class="token operator"><</span> developers <span class="token punctuation">.</span> length <span class="token punctuation">;</span> i <span class="token operator">++</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> listNames <span class="token punctuation">.</span> <span class="token function">push</span> <span class="token punctuation">(</span> developers <span class="token punctuation">[</span> i <span class="token punctuation">]</span> <span class="token punctuation">.</span> name <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> listNames <span class="token punctuation">}</span> |
Use .forEach()
:
1 2 3 4 5 6 7 8 9 10 11 | <span class="token keyword">var</span> <span class="token function-variable function">listNameEmployeesUsingForEach</span> <span class="token operator">=</span> <span class="token keyword">function</span> <span class="token punctuation">(</span> developers <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> listNames <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token punctuation">]</span> <span class="token punctuation">;</span> developers <span class="token punctuation">.</span> <span class="token function">forEach</span> <span class="token punctuation">(</span> <span class="token keyword">function</span> <span class="token punctuation">(</span> developer <span class="token punctuation">)</span> <span class="token punctuation">{</span> listNames <span class="token punctuation">.</span> <span class="token function">push</span> <span class="token punctuation">(</span> developer <span class="token punctuation">.</span> name <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">return</span> listNames <span class="token punctuation">}</span> |
And when using map ()
Use .map()
:
1 2 3 4 5 6 | <span class="token keyword">var</span> <span class="token function-variable function">listNameEmployeesUsingMap</span> <span class="token operator">=</span> <span class="token keyword">function</span> <span class="token punctuation">(</span> developers <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> developers <span class="token punctuation">.</span> <span class="token function">map</span> <span class="token punctuation">(</span> developer <span class="token operator">=></span> developer <span class="token punctuation">.</span> name <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">// ["Bjarne Stroustrup", "James Gosling", "Linus Torvalds", "Guido van Rossum", "Ken Thompson"]</span> |
What just happened? Why only one line has reached the other. Let me explain what happened when using the map in the example above:
- Create a mapArr array
- Loop through the developers array elements
- Call mapFunc function with current element as argument
- Push the result of mapFunc to mapArr array
- Returns the mapArr array after having browsed all the elements
Quite similar to using .for()
and .forEach
right.
Also you can handle data (add, modify) via map ()
Help me get the developer age:
1 2 3 4 | developers <span class="token punctuation">.</span> <span class="token function">map</span> <span class="token punctuation">(</span> developer <span class="token operator">=></span> <span class="token number">2020</span> <span class="token operator">-</span> developer <span class="token punctuation">.</span> born <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// [70, 65, 51, 64, 77]</span> |
How to create the map () function
The .map()
function can be implemented via recursion.
1 2 3 4 5 6 7 | <span class="token keyword">const</span> <span class="token function-variable function">customMap</span> <span class="token operator">=</span> <span class="token punctuation">(</span> fn <span class="token punctuation">,</span> arr <span class="token punctuation">,</span> i <span class="token operator">=</span> <span class="token number">0</span> <span class="token punctuation">,</span> result <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token punctuation">]</span> <span class="token punctuation">)</span> <span class="token operator">=></span> i <span class="token operator"><</span> arr <span class="token punctuation">.</span> length <span class="token operator">?</span> <span class="token function">customMap</span> <span class="token punctuation">(</span> fn <span class="token punctuation">,</span> arr <span class="token punctuation">,</span> i <span class="token operator">+</span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token punctuation">[</span> <span class="token operator">...</span> result <span class="token punctuation">,</span> <span class="token function">fn</span> <span class="token punctuation">(</span> arr <span class="token punctuation">[</span> i <span class="token punctuation">]</span> <span class="token punctuation">)</span> <span class="token punctuation">]</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> result console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token function">customMap</span> <span class="token punctuation">(</span> developer <span class="token operator">=></span> developer <span class="token punctuation">.</span> name <span class="token punctuation">,</span> developers <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token comment">// ["Bjarne Stroustrup", "James Gosling", "Linus Torvalds", "Guido van Rossum", "Ken Thompson"]</span> |
Filter Pattern
The filter will apply a function that checks the condition of passing each element individually, thereby returning a new array with data containing the elements that passed that condition (returning true).
The name says it all, whenever you want to filter data from an array, use the filter. Let’s start with retrieving developers born after 1950.
Input: An array of developers data
Output: An array of data only containing developers born after 1950
Best way
1 2 3 4 | <span class="token keyword">var</span> <span class="token function-variable function">listDevelopersOlder25UsingFilter</span> <span class="token operator">=</span> <span class="token keyword">function</span> <span class="token punctuation">(</span> developers <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> developers <span class="token punctuation">.</span> <span class="token function">filter</span> <span class="token punctuation">(</span> developer <span class="token operator">=></span> developer <span class="token punctuation">.</span> born <span class="token operator"><=</span> <span class="token number">1950</span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> |
Let’s go step by step to see how the .filter()
function works:
- Create an empty array filterArr.
- Loop through array elements.
- Call the filterFunc function with the current element as argument.
- If the result is correct, push the element into the filterArr array.
- Returns the filterArr array after passing all the elements.
When not using filters
1 2 3 4 5 6 7 8 9 10 11 12 | <span class="token keyword">var</span> <span class="token function-variable function">listDevelopersOlder1950UsingForEach</span> <span class="token operator">=</span> <span class="token keyword">function</span> <span class="token punctuation">(</span> developers <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> listOfAges <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token punctuation">]</span> <span class="token punctuation">;</span> developers <span class="token punctuation">.</span> <span class="token function">forEach</span> <span class="token punctuation">(</span> <span class="token keyword">function</span> <span class="token punctuation">(</span> developer <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> developer <span class="token punctuation">.</span> born <span class="token operator"><</span> <span class="token number">1950</span> <span class="token punctuation">)</span> listOfAges <span class="token punctuation">.</span> <span class="token function">push</span> <span class="token punctuation">(</span> developer <span class="token punctuation">.</span> born <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">return</span> listOfAges <span class="token punctuation">}</span> |
And here is the result returned:
1 2 3 4 5 | <span class="token punctuation">[</span> <span class="token punctuation">{</span> id <span class="token punctuation">:</span> <span class="token number">1</span> <span class="token punctuation">,</span> name <span class="token punctuation">:</span> <span class="token string">'Bjarne Stroustrup'</span> <span class="token punctuation">,</span> born <span class="token punctuation">:</span> <span class="token number">1950</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">{</span> id <span class="token punctuation">:</span> <span class="token number">5</span> <span class="token punctuation">,</span> name <span class="token punctuation">:</span> <span class="token string">'Ken Thompson'</span> <span class="token punctuation">,</span> born <span class="token punctuation">:</span> <span class="token number">1943</span> <span class="token punctuation">}</span> <span class="token punctuation">]</span> |
How to create the filter () function
We can create the filter () function by using recursive functions.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <span class="token keyword">const</span> <span class="token function-variable function">customFilter</span> <span class="token operator">=</span> <span class="token punctuation">(</span> predicate <span class="token punctuation">,</span> arr <span class="token punctuation">,</span> i <span class="token operator">=</span> <span class="token number">0</span> <span class="token punctuation">,</span> res <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token punctuation">]</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> i <span class="token operator"><</span> arr <span class="token punctuation">.</span> length <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token function">predicate</span> <span class="token punctuation">(</span> arr <span class="token punctuation">[</span> i <span class="token punctuation">]</span> <span class="token punctuation">)</span> <span class="token operator">?</span> <span class="token function">customFilter</span> <span class="token punctuation">(</span> predicate <span class="token punctuation">,</span> arr <span class="token punctuation">,</span> i <span class="token operator">+</span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token punctuation">[</span> <span class="token operator">...</span> res <span class="token punctuation">,</span> arr <span class="token punctuation">[</span> i <span class="token punctuation">]</span> <span class="token punctuation">]</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token function">customFilter</span> <span class="token punctuation">(</span> predicate <span class="token punctuation">,</span> arr <span class="token punctuation">,</span> i <span class="token operator">+</span> <span class="token number">1</span> <span class="token punctuation">,</span> res <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> res <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">;</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token function">customFilter</span> <span class="token punctuation">(</span> developer <span class="token operator">=></span> developer <span class="token punctuation">.</span> born <span class="token operator"><=</span> <span class="token number">1950</span> <span class="token punctuation">,</span> developers <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token comment">/*[ { id: 1, name: 'Bjarne Stroustrup', born: 1950 }, { id: 5, name: 'Ken Thompson', born: 1943 } ]*/</span> |
Reduce Pattern
Reduce will convert the array into a value by combining each element together.
For example, if you have an array of subject transcripts, now you want to know your comma, reduce will easily help you calculate and return the comma for you. Now we want to know what is the average year of developer development:
Input: An array of developers data
Output: The average birth year of the developer
Best way
Using .reduce()
is really simple:
1 2 3 | <span class="token keyword">var</span> averageYear <span class="token operator">=</span> developers <span class="token punctuation">.</span> <span class="token function">reduce</span> <span class="token punctuation">(</span> <span class="token punctuation">(</span> acc <span class="token punctuation">,</span> developer <span class="token punctuation">)</span> <span class="token operator">=></span> acc <span class="token operator">+</span> developer <span class="token punctuation">.</span> born <span class="token punctuation">,</span> <span class="token number">0</span> <span class="token punctuation">)</span> <span class="token operator">/</span> <span class="token punctuation">(</span> developers <span class="token punctuation">.</span> length <span class="token punctuation">)</span> <span class="token operator"><<</span> <span class="token number">1954.6</span> |
When not using reduce
1 2 3 4 5 6 7 8 | <span class="token keyword">var</span> sumOfYears <span class="token operator">=</span> <span class="token number">0</span> developers <span class="token punctuation">.</span> <span class="token function">forEach</span> <span class="token punctuation">(</span> developer <span class="token operator">=></span> <span class="token punctuation">{</span> sumOfYears <span class="token operator">+=</span> developer <span class="token punctuation">.</span> born <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">var</span> averageYear <span class="token operator">=</span> sumOfYears <span class="token operator">/</span> <span class="token punctuation">(</span> developers <span class="token punctuation">.</span> length <span class="token punctuation">)</span> |
Bonus
How to use join ()
If you want to get enough information of the developer then how?
1 2 3 4 | <span class="token keyword">const</span> <span class="token function-variable function">toString</span> <span class="token operator">=</span> <span class="token keyword">function</span> <span class="token punctuation">(</span> developer <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> developer <span class="token punctuation">.</span> name <span class="token operator">+</span> <span class="token string">"was born in "</span> <span class="token operator">+</span> developer <span class="token punctuation">.</span> born <span class="token punctuation">}</span> |
Everything looks good, but we should write the following:
1 2 3 4 | <span class="token keyword">const</span> <span class="token function-variable function">toString</span> <span class="token operator">=</span> <span class="token keyword">function</span> <span class="token punctuation">(</span> developer <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token punctuation">[</span> developer <span class="token punctuation">.</span> name <span class="token punctuation">,</span> <span class="token string">"was born in"</span> <span class="token punctuation">,</span> developer <span class="token punctuation">.</span> born <span class="token punctuation">]</span> <span class="token punctuation">.</span> <span class="token function">join</span> <span class="token punctuation">(</span> <span class="token string">" "</span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> |
How to use .min () or .max ()
Comparing two values with each other and then returning a smaller or larger value is quite common: The typical way to solve that problem is:
1 2 3 | Math <span class="token punctuation">.</span> min <span class="token punctuation">.</span> <span class="token function">apply</span> <span class="token punctuation">(</span> Math <span class="token punctuation">,</span> <span class="token punctuation">(</span> developers <span class="token punctuation">.</span> <span class="token function">map</span> <span class="token punctuation">(</span> developer <span class="token operator">=></span> developer <span class="token punctuation">.</span> born <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token operator"><<</span> <span class="token number">1946</span> |
Why so? The Math.min()
function will return the smallest value of any set of numbers, right. Each parameter is passed in turn rather than passed directly into an array. To make it easier to understand, see the example below:
1 2 3 4 5 | Math <span class="token punctuation">.</span> <span class="token function">min</span> <span class="token punctuation">(</span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token number">2</span> <span class="token punctuation">,</span> <span class="token number">3</span> <span class="token punctuation">,</span> <span class="token number">4</span> <span class="token punctuation">)</span> <span class="token operator"><<</span> <span class="token number">1</span> Math <span class="token punctuation">.</span> <span class="token function">min</span> <span class="token punctuation">(</span> <span class="token punctuation">[</span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token number">2</span> <span class="token punctuation">,</span> <span class="token number">3</span> <span class="token punctuation">,</span> <span class="token number">4</span> <span class="token punctuation">]</span> <span class="token punctuation">)</span> <span class="token operator"><<</span> <span class="token number">NaN</span> |
Before the ES6 / ES2015 .apply () function was used to solve that problem. Also can use Spread syntax (…) for ES6
1 2 3 4 5 6 7 | Math <span class="token punctuation">.</span> min <span class="token punctuation">.</span> <span class="token function">apply</span> <span class="token punctuation">(</span> Math <span class="token punctuation">,</span> <span class="token punctuation">[</span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token number">2</span> <span class="token punctuation">,</span> <span class="token number">3</span> <span class="token punctuation">,</span> <span class="token number">4</span> <span class="token punctuation">]</span> <span class="token punctuation">)</span> <span class="token operator"><<</span> <span class="token number">1</span> Math <span class="token punctuation">.</span> min <span class="token punctuation">.</span> <span class="token function">apply</span> <span class="token punctuation">(</span> <span class="token keyword">null</span> <span class="token punctuation">,</span> <span class="token punctuation">[</span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token number">2</span> <span class="token punctuation">,</span> <span class="token number">3</span> <span class="token punctuation">,</span> <span class="token number">4</span> <span class="token punctuation">]</span> <span class="token punctuation">)</span> <span class="token operator"><<</span> <span class="token number">1</span> Math <span class="token punctuation">.</span> <span class="token function">min</span> <span class="token punctuation">(</span> <span class="token operator">...</span> <span class="token punctuation">[</span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token number">2</span> <span class="token punctuation">,</span> <span class="token number">3</span> <span class="token punctuation">,</span> <span class="token number">4</span> <span class="token punctuation">]</span> <span class="token punctuation">)</span> <span class="token operator"><<</span> <span class="token number">1</span> |
How to create the sum () function
The .sum () function returns the sum of all values in a given array.
1 2 3 4 | <span class="token keyword">const</span> <span class="token function-variable function">sum</span> <span class="token operator">=</span> <span class="token keyword">function</span> <span class="token punctuation">(</span> arr <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> arr <span class="token punctuation">.</span> <span class="token function">reduce</span> <span class="token punctuation">(</span> <span class="token punctuation">(</span> a <span class="token punctuation">,</span> b <span class="token punctuation">)</span> <span class="token operator">=></span> a <span class="token operator">+</span> b <span class="token punctuation">,</span> <span class="token number">0</span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> |
Refer
https://levelup.gitconnected.com/use-collections-wisely-in-javascript-c1440f2ff595
https://www.freecodecamp.org/news/how-to-write-your-own-map-filter-and-reduce-functions-in-javascript-ab1e35679d26/