functional filter

by Csaba Hellinger

HTML

Functional:
<ul>
    <li>No variables</li>
    <li>No mutation</li>
    <li>No side effects</li>
    <li>No loops</li>
    <li>Recursion with proper tail call</li>
</ul>
(Results on the console)

CSS

ul {
    margin-top: 0;
}

JavaScript

function filter(input, callback) {
    function inner(input, callback, index, output) {
        if (index === input.length) {
            return output;
        }
        return inner(input, callback, index + 1, callback(input[index]) ? output.concat(input[index]) : output);
    }
    return inner(input, callback, 0, []);
}

// try it out
let items = [1, 2, 3, 4, 5, 6],
	result = filter(items, item => item % 2 === 0);
console.log(items, 'even', result);