# Intro to Functional JavaScript

Do you know that out of the box JavaScript has some amazing parts, making it suitable for Functional Programming?

## Folding, Reduction, and Filtering

Let’s say we have ten bank accounts.

``````let accounts = [
{ id: 0, balance: 122.01 },
{ id: 1, balance: 15.111 },
{ id: 2, balance: 7703.5 },
{ id: 3, balance: 9333.2 },
{ id: 4, balance: 1472.111 },
{ id: 5, balance: 993.5 },
{ id: 6, balance: 0.222 },
{ id: 7, balance: 1599.111 },
{ id: 8, balance: 779.5 },
{ id: 9, balance: 93.2 }
];
``````

To warm-up, let’s find the total balance. We can do it by folding account balances using addition operator, and initial value of `0`. In JavaScript it can be accomplished using `reduce()`.

``````let totalBalance = accounts.reduce(
(sum, account) => sum + account.balance,
0
);
``````

Now, what if we need to get all the accounts with the balance of 700.00 or higher? It is done using `filter()`.

``````let filteredAccounts = accounts.filter(
(account) => account.balance > 700
);
``````

What if we only need to work with account `id`s? Function `map()` is really helpful for this case!

``````let ids = accounts.map((account) => account.id);
``````

We can also chain these functions, and manipulate collections in short, and elegant way.

``````accounts
.map((account) => account.balance)
.filter((balance) => balance < 100)
.reduce((sum, balance) => sum + balance, 0);
``````

Amazing, is not it? Now, let’s see some more!

## ES6 Destructuring Operator

We have an array of ten numbers.

``````let numbers = [0,1,2,3,4,5,6,7,8,9];
``````

This is how we can iterate, and print them using the Tail recursion.

``````function printArray(array) {
if(array.length > 0) {
printArray(tail);
}
}
``````

Using the destructuring operator, we can also create variadic functions, similar to ones in LISP.

``````function variadicPrint(...array) {
array.forEach(element => console.log(element))
}
``````

All the following calls to the function above are legal.

``````variadicPrint(0, 1, 2, 3);