 # 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 ids? 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);   